首页 > 解决方案 > 如果不存在,Mongoose 将项目推送到数组

问题描述

我有一个这样的模型架构:

Collection: {
    irrelevant fields,
    object: { 
        more irrelevant fields,
        array:
        [
            {
                field1,
                field2,
                _id: false
            }
        ]
    }
}

我想将不与数组中已经存在的 field1 重复的任何对象 {field1, field2} 推送到数组(在 updateOne 查询中)。field2 不断更新自己,我尝试过 addtoset 但它认为 field2 所以它最终添加了另一个我不想添加的项目。

例如:

array:[
    {field1: 1, field2: 6},
    {field1: 2, field2: 4},
    {field1: 3, field2: 1}
]

如果我想推{field1: 2, field2: 6}它不应该让我推它,因为 field1:2 已经存在于数组中。(使用 addtoset,即使它确实检查了 field1:2 是否已经存在,但由于 field2 不同,它最终会添加 te 对象)

array:[
    {field1: 1, field2: 6},
    {field1: 2, field2: 4},
    {field1: 3, field2: 1}
    {field1: 2, field2: 6}
]

标签: node.jsarraysmongodbmongoose

解决方案


您可以使用带有$cond运算符的管道形式的更新。如果该field1值已经存在,则保持数组的值相同,如果不存在,则将新值附加到末尾。

也许类似于:

const newValue = {field1: 2, field2: 6};

db.collection.update({match criteria},
    [{$set:{
         array:{
             $cond:{
               if: {$in: [newValue.field1, "$array.field1"]},
               then: "$array",
               else: {$concatArrays: ["$array", [newValue]]}]}
             }
         }
     }}]
)

推荐阅读