使用MongoDB升级

时间:2019-03-15 10:03:07

标签: node.js mongodb upsert

我正在寻找一种使我的代码更优雅的方法。我想根据“ 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);

我想念什么?

1 个答案:

答案 0 :(得分:1)

根据mongodb文档,upsert的工作方式如下:

  

upsert:如果没有文档符合查询条件,则true会创建一个新文档。

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

因此,您必须使用与任何文档都不匹配的查询,因此必须确保它将插入一个新文档。请注意,如果您使用{_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,因为没有文档应与提供的查询相匹配。

相关问题