- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个像这样的 Mongoose 模式:
A = {
_id: Schema.Types.ObjectId,
arrayA:[{
_id,
nestedArray: [Schema.Types.ObjectId]
}],
arrayB: [Schema.Types.ObjectId]
}
我想将一个对象 ID 插入特定 arrayA 对象中的nestedArray 中并且arrayB 应通过以下代码包含特定的对象 ID:
A.update({'arrayA._id': arrayAId, arrayB: {$in: [arrayContainsSomeArrayBIds]}},
{$push: {'arrayA.$.nestedArray': nestedArrayId}}, function(err) {
});
但是,对象 ID 被推送到 arrayA 中最后一个对象的nestedArray 中。如果删除 arrayB: {$in: [arrayContainsSomeArrayBIds]}
,则可以将对象 ID 推送到 arrayA 中的正确对象中。
Mongoose 版本:3.8.21
谁能帮我找出问题所在吗?
最佳答案
目前,当查询文档包含对除正在更新的数组之外的其他数组的引用时,在 MongoDB
中无法使用 positional
运算符更新数组元素。
下面的代码包含对两个数组字段的引用:arrayA
和 arrayB
,当更新在 arrayA
上发布。这是无效的,并且会导致不良行为。
A.update({'arrayA._id': arrayAId, arrayB: {$in: [arrayContainsSomeArrayBIds]}},
{$push: {'arrayA.$.nestedArray': nestedArrayId}}, function(err) {
});
来自docs ,
Only one array field may appear in the query document. The query document should only contain a single condition on the array field being projected. Multiple conditions may override each other internally and lead to undefined behavior. Under these requirements, the following query is incorrect:
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) {
});
})
});
关于node.js - Mongoose $push 无法将对象推送到正确的文档中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27753637/
我是一名优秀的程序员,十分优秀!