1

我正在尝试使用在 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

4 回答 4

2

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

"$pushAll" 中的多余空间需要删除。它可能有引号:“$pushAll”。

于 2012-10-31T17:03:49.863 回答
2

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

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

它应该是

{ $pushAll: { events: events }}
于 2012-10-31T15:49:34.637 回答
1

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

于 2012-11-01T07:24:26.637 回答
1

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

db.events.update(
    { _id: entityId },
    { $addToSet: { $each: events } }
)
于 2014-01-25T05:38:13.717 回答