【问题标题】:Mongoose push item to array if not exists如果不存在,Mongoose 将项目推送到数组
【发布时间】:2020-12-31 03:35:59
【问题描述】:

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

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.js arrays mongodb mongoose


    【解决方案1】:

    您可以通过$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]]}]}
                 }
             }
         }}]
    )
    

    【讨论】:

    • 如果 fild1 确实存在,我需要更新数组中现有项的值怎么办?
    • 如果更改过于复杂而无法放在then 行,请查看使用$reduce
    猜你喜欢
    • 2014-12-07
    • 2020-04-02
    • 2019-01-06
    相关资源
    最近更新 更多