使用 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,因为没有文档应该与提供的查询匹配。
我正在寻找一种使我的代码更优雅的方法。我想根据 "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,因为没有文档应该与提供的查询匹配。