我正在寻找一种使我的代码更优雅的方法。我想根据“ 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);
我想念什么?
答案 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,因为没有文档应与提供的查询相匹配。