【问题标题】:MongoDB Upsert add to arrayMongoDB Upsert 添加到数组
【发布时间】:2014-01-25 13:38:13
【问题描述】:

我正在尝试使用在 NodeJS 中运行的一些打字稿代码在 mongodb 文档中插入/更新字符串数组。 以下代码是打字稿,但我想 JS 开发人员会得到它而没有任何问题:

export function addEvents(entityId: string, 
                          events: string[] , 
                          callback: () => void) {

   db.collection('events', function(error, eventCollection) {
       if(error) { 
           console.error(error); return; 
       }
       eventCollection.update({ _id: entityId }, { "$pushAll ": 
       { events: events }},
           function(error, result) {
               if(error) { 
                   console.error(error); return; 
               }
               callback();
           });
   });
}

文档具有以下结构:

{
    _id : string
    events : ["array","of","strings"]
}

我只是想在现有数组的末尾为特定的_id附加一个数组字符串。

我不太明白是否应该使用 update、save、$push、$pushall 等。

谁能解释一下?

【问题讨论】:

    标签: node.js mongodb typescript


    【解决方案1】:

    如果我理解正确,问题是 pushAll 什么都不做或更新返回错误?也许您的示例中有复制粘贴错误,但我认为您在这里有错字。

    { "$pushAll ":  { events: events }}
    

    应该是

    { $pushAll: { events: events }}
    

    【讨论】:

      【解决方案2】:

      你的 update 和 $pushAll 的组合看起来是你在这里所做的最好的选择——它用于将一个数组附加到一个现有的数组。 $push 用于将元素添加到数组中。保存将涉及获取现有事件数组,附加到它,然后保存文档。

      “$pushAll”中多余的空格需要去掉。它可能有引号:“$pushAll”。

      【讨论】:

        【解决方案3】:

        发现问题,我需要将“{ upsert = true }”作为第三个参数传递给更新函数。

        【讨论】:

          【解决方案4】:

          在这种情况下,要实现“upsert”语义,您需要使用$addToSet。如果您有要添加的值数组,则需要输入 $each 修饰符。从 mongo shell:

          db.events.update(
              { _id: entityId },
              { $addToSet: { $each: events } }
          )
          

          【讨论】:

            猜你喜欢
            • 2014-05-05
            • 2021-10-31
            • 1970-01-01
            • 2020-03-17
            • 1970-01-01
            • 2021-06-17
            • 1970-01-01
            • 2021-12-09
            • 1970-01-01
            相关资源
            最近更新 更多