MongoError:无法推断要设置的查询字段,路径“用户”匹配两次

Posted

技术标签:

【中文标题】MongoError:无法推断要设置的查询字段,路径“用户”匹配两次【英文标题】:MongoError: cannot infer query fields to set, path 'users' is matched twice 【发布时间】:2016-12-27 21:39:59 【问题描述】:

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

我就是这样做的:

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

但我得到了错误:

MongoError:无法推断要设置的查询字段,路径“用户”匹配 两次

这是Chat 架构:


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

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

【问题讨论】:

【参考方案1】:

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


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

对已接受答案的修改:

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

【讨论】:

添加 mongoose.Types.ObjectId() 对我有用,谢谢。【参考方案2】:

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

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

a 是一个同时包含 0 和 1 的数组时,这将匹配,否则将 upsert。

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

【讨论】:

【参考方案3】:

我以此为条件


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

【讨论】:

这会导致 $elemMatch 需要一个对象 错误。可以通过使用$eq操作符来解决,比如$elemMatch: $eq: userId1,

以上是关于MongoError:无法推断要设置的查询字段,路径“用户”匹配两次的主要内容,如果未能解决你的问题,请参考以下文章

MongooseJS 无法禁用字段独有

MongoError 异常:FieldPath 字段名称可能不以“$”开头

(节点:17348)UnhandledPromiseRejectionWarning:MongoError:对路径“_id”执行更新将修改不可变字段“_id”

MongoError:无法在本地运行项目

MongoError:无法获取锁

MongoError:无法从缺少的 BSON 类型转换为日期