gpt4 book ai didi

node.js - Mongoose $push 无法将对象推送到正确的文档中

转载 作者:太空宇宙 更新时间:2023-11-04 02:29:51 28 4
gpt4 key购买 nike

我有一个像这样的 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 运算符更新数组元素。

下面的代码包含对两个数组字段的引用:arrayAarrayB,当更新在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com