Node.js 升级MongoDB

Node.js 升级MongoDB,node.js,mongodb,upsert,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_parkin

我正在寻找一种使我的代码更加优雅的方法。我想根据“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在没有文档与查询条件匹配时创建新文档

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

因此,您必须使用与任何文档都不匹配的查询,您必须确保它将插入一个新的文档。小心,如果您使用
{u id:'}
{u 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,因为没有文档应该与提供的查询匹配