MongoError:无法推断要设置的查询字段,路径“用户”匹配两次
Posted
技术标签:
【中文标题】MongoError:无法推断要设置的查询字段,路径“用户”匹配两次【英文标题】:MongoError: cannot infer query fields to set, path 'users' is matched twice 【发布时间】:2016-12-27 21:39:59 【问题描述】:我正在使用猫鼬。我想创建一个带有数组users
(包括userId1
、userId2
)的文档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:无法推断要设置的查询字段,路径“用户”匹配两次的主要内容,如果未能解决你的问题,请参考以下文章
MongoError 异常:FieldPath 字段名称可能不以“$”开头
(节点:17348)UnhandledPromiseRejectionWarning:MongoError:对路径“_id”执行更新将修改不可变字段“_id”