我经常在下面使用这种模式。使用两个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;
答案 0 :(得分:1)
可以使用findAndModify
。
有一个软件包可以添加这个功能(尽管如果我自己实现的话,我可能会做的有点不同)。
$ meteor add fongandrew:find-and-modify
它将原始方法添加到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;