MongoError: cannot infer query fields to set, path

2020-08-26 03:26发布

问题:

I am using mongoose. I want to create a document chat with an array users (including userId1, userId2), if I do not find it:

This is how I do:

ChatModel.findOneAndUpdate(
  { users: { $all: [userId1, userId2] }},
  { $setOnInsert: {
    users: [userId1, userId2]
  }},
  { upsert: true })
  .exec()
  .catch(err => console.log(err));

But I got the error:

MongoError: cannot infer query fields to set, path 'users' is matched twice

This is Chat Schema:

{
  users: [{ type: Schema.Types.ObjectId, ref: 'User' }],
  createdAt: { type: Date, default: Date.now }
}

How can I do it correctly? Thanks

回答1:

I use this as the condition

{
  "users": {
        $all: [
          {"$elemMatch": userId1},
          {"$elemMatch": userId2}
        ]
  }......
}


回答2:

I know this already has an answer but to hopefully save someone else some time, I had to do this:

{
  "users": {
        $all: [
          { $elemMatch: { $eq: mongoose.Types.ObjectId(userId1) }},
          { $elemMatch: { $eq: mongoose.Types.ObjectId(userId2) }}
        ]
  }......
}

Modifications from accepted answer:

  • The $eq was needed just like Dave Howson said in his comment on the accepted answer.
  • mongoose.Types.ObjectId was needed because I guess the _id property on my schema instance was a string.


回答3:

There is a workaround for this issue:

db.foo.update({a:{$all:[{$elemMatch:{$eq:0}},{$elemMatch:{$eq:1}}]}},{$set:{b:1}},{upsert:true})

This will match when a is an array with both 0 and 1 in it and it will upsert otherwise.

From: https://jira.mongodb.org/browse/SERVER-13843?focusedCommentId=2305903&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-2305903