我有一个像这样的猫鼬模式:
A = {
_id: Schema.Types.ObjectId,
arrayA:[{
_id,
nestedArray: [Schema.Types.ObjectId]
}],
arrayB: [Schema.Types.ObjectId]
}
我想将Object Id推送到特定arrayA对象AND中的nestedArray arrayB应该包含一个特定的Object Id,代码如下:
A.update({'arrayA._id': arrayAId, arrayB: {$in: [arrayContainsSomeArrayBIds]}},
{$push: {'arrayA.$.nestedArray': nestedArrayId}}, function(err) {
});
但是,Object Id被推送到arrayA中最后一个对象的nestedArray。
如果删除arrayB: {$in: [arrayContainsSomeArrayBIds]}
,则可以将Object Id推送到arrayA中的正确对象。
猫鼬版:3.8.21
任何人都可以帮我找出问题吗?
答案 0 :(得分:0)
目前,MongoDB
无法使用positional
运算符更新数组元素,当查询文档包含对正在更新的数组之外的其他数组的引用时。
以下代码包含对两个数组字段的引用:arrayA
和arrayB
,何时
更新发布在arrayA
。这是无效的,会导致不良行为。
A.update({'arrayA._id': arrayAId, arrayB: {$in: [arrayContainsSomeArrayBIds]}},
{$push: {'arrayA.$.nestedArray': nestedArrayId}}, function(err) {
});
来自docs,
查询文档中只能出现一个数组字段。 查询文档应该只包含数组字段上的单个条件 被投射。 多个条件可能会互相覆盖 内部并导致未定义行为。 根据这些要求, 以下查询不正确:
db.collection.find( { <array>: <value>, <someOtherArray>: <value2> },
{ "<array>.$": 1 } )
解决方案是修改您的代码以触发两个查询:
_ids
文件。示例代码流程:
A.find({'arrayA._id': arrayAId, arrayB: {$in: [arrayContainsSomeArrayBIds]}},
function(err,data){
data.forEach(function(doc){
A.update({'arrayA._id': arrayAId,
"_id":doc._id},
{$push: {'arrayA.$.nestedArray': nestedArrayId}},
function(err) {
});
})
});