使用 MongoDB 进行更新

Upserting with MongoDB

我正在寻找一种使我的代码更优雅的方法。我想根据 "id" 变量是否为空来创建条目或更新现有条目。目前我的代码如下所示:

    if(data.id == '')
        dbo.collection('parkings').insert(entry, refresh_parkings);     
    else
        dbo.collection('parkings').update({ '_id' : data.id }, entry, refresh_parkings);

我正在尝试使用 upsert 参数将其合并为一行。我已经尝试了很多东西,但它不起作用,条目总是更新,没有创建新条目。

// First attempt
dbo.collection('parkings').update({ '_id' : data.id }, entry, {upsert: true}, refresh_parkings);

// Second attempt
 if(data.id != '')
   var id = {'_id': data.id};
 else
   var id = {};

dbo.collection('parkings').update(id, entry, {upsert: true}, refresh_parkings);

我错过了什么?

根据 mongodb 文档,upsert 的工作原理如下:

upsert: true creates a new document when no document matches the query criteria.

这里,如果查询为空{},那么它将匹配所有文档。然后更新第一个匹配的文档。

所以您必须使用与任何文档都不匹配的查询,您必须确保它会插入一个新文档。小心,如果你使用 {_id: ''}{_id: 'undefined'},因为没有文档应该有这样的 id,它不会按预期工作:它会插入一个新文档,并将指定的 _id 作为值。请务必使用另一个属性来创建查询。

然后试试这个:

if(data.id != '')
   var id = {'_id': data.id};
else
  var id = {'unexistingAttribute': 'anyValue'};

dbo.collection('parkings').update(id, entry, {upsert: true}, refresh_parkings);

然后它应该创建一个新文档并生成一个正确的新 _id,因为没有文档应该与提供的查询匹配。