从Find或Insert,MongoDB获取ID

时间:2016-11-13 21:08:37

标签: javascript mongodb meteor

我经常在下面使用这种模式。使用两个MongoDB调用工作似乎有点笨拙,我想知道是否有更好的方法吗?我正在寻找现有文档的ID,或者..我想创建一个新ID并使用其ID。在Meteor中,我可以在一个电话中这样做吗?

var thing_id;
var existing_doc = Things.findOne({name:'Thing One'});
if (existing_doc) thing_id = existing_doc._id;                              
else thing_id    = Things.insert({name:'Thing One'});
return thing_id;

2 个答案:

答案 0 :(得分:1)

可以使用findAndModify

有一个软件包可以添加这个功能(尽管如果我自己实现的话,我可能会做的有点不同)。

$ meteor add fongandrew:find-and-modify

及其repository on GitHub

它将原始方法添加到Mongo.Collection的原型并包装异步,以便可以使用服务器上的光纤运行。

如果您将true作为第二个参数传递,则可以获得原始输出。

这是一个包含一个插入和一个更新的简短示例。

> const Foo = new Mongo.Collection("foo");
> Foo.insert({foo: 1});
'6Mkpdjf3sXDZy6ioQ'
> Foo.findAndModify({query: {foo: 1}, update: {$set: {bar: 1}}, upsert: true}, true )
{ lastErrorObject: { updatedExisting: true, n: 1 },
  value: { _id: '6Mkpdjf3sXDZy6ioQ', foo: 1 },
  ok: 1 }
> Foo.findAndModify({query: {foo: 2}, update: {$set: {bar: 2}}, upsert: true}, true )
{ lastErrorObject: { updatedExisting: false, n: 1, upserted: 'y4eQzLWqCyBNr2WW9' },
  value: null,
  ok: 1 }
> Foo.findOne({foo: 2});
{ _id: 'y4eQzLWqCyBNr2WW9', foo: 2, bar: 2 }
> 

如果你想每次都获得_id,你可能需要做一些额外的工作来简化它,但它是可行的。

答案 1 :(得分:0)

即使upsert没有为您提供_id,您仍然可以使用它将代码简化为:

 Things.upsert({name:'Thing One'});
 return Things.findOne({name:'Thing One')})._id;