MongoDB Upsert添加到数组

时间:2012-10-31 15:21:03

标签: node.js mongodb typescript

我正在尝试使用在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等,我不会得到。

有人可以解释一下吗?

4 个答案:

答案 0 :(得分:2)

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

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

应该是

{ $pushAll: { events: events }}

答案 1 :(得分:2)

您更新和$ pushAll的组合看起来像是您在这里所做的最佳选择 - 它是将数组附加到现有数组。 $ push用于向数组添加元素。 save将涉及获取现有事件数组,附加到它,然后保存文档。

需要删除“$ pushAll”中的额外空格。它可能有引号:“$ pushAll”。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

要在这种情况下实现'upsert'语义,您需要使用$addToSet。如果要添加一组值,则需要输入$each修饰符。来自mongo shell:

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