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

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

我正在使用猫鼬。我想用数组users(包括userId1userId2)创建一个文档chat,如果找不到:

我是这样做的:

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

但是我得到了错误:

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

这是 Chat 架构:

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

我怎样才能正确地做到这一点?谢谢

我以此为条件

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

这个问题有一个解决方法:

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

a 是同时包含 0 和 1 的数组时,这将匹配,否则它将更新。

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

我知道这已经有了答案,但希望能为其他人节省一些时间,我不得不这样做:

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

对已接受答案的修改:

  • 就像 Dave Howson 在他对已接受答案的评论中所说的那样,需要 $eq。
  • mongoose.Types.ObjectId 是必需的,因为我猜我的模式实例上的 _id 属性 是一个字符串。