流星upsert相当于

时间:2012-11-03 04:40:33

标签: mongodb meteor upsert

在Meteor中实现upsert命令的时间有多快?

而且,同时做同样事情的最好方法是什么?

这样的事情就是我现在正在做的事情:

if typeof ( item = Items.findOne({title:'Foo'}) ) == 'undefined'
    item = Items.insert({title:'Foo'})
else
    Items.update(item._id, {$set: {title:'Foo'}})
# do something with item

3 个答案:

答案 0 :(得分:5)

  

在Meteor中实现upsert命令的时间有多快?

更新:@Thomas4019指出现在支持upsert

v0.6.6

“添加upsert支持.Follection.update现在支持{upsert:true}选项。此外,添加一个Collection.upsert方法,如果适用,返回新插入的对象ID。”

来源:History.md

使用文档:http://docs.meteor.com/#upsert

- 原始答案如下 -

Trello Meteor路线图上有一张卡片,您可以投票表明它对您的重要性:https://trello.com/c/C91INHmj

它目前处于“后期”列表中,这意味着它将在实施之前一段时间,除非它收到很多选票。

另一个需要注意的重要事项是,由于meteor是开源的,您可以自己实施必要的更改并提交回来。


  

同时做同样事情的最佳方式是什么?

有几种解决方案,但最适合您的用例,如果不了解您的设计,则无法判断。

  1. 按原样使用代码,为集合添加唯一索引,并在/出现时处理重复键错误

  2. 更改设计以实现显式乐观并发。

  3. 这两个解决方案的核心是相同的,优雅地处理错误情况。 #1更容易实现。 #2允许更灵活地处理乐观并发。

答案 1 :(得分:0)

如果您真的想这样做,可以直接使用mongodb连接:MongoInternals.defaultRemoteCollectionDriver().mongo.db.collection('myCollection').update(query, update, {upsert: true})。当然,这种联系没有记录,所以将来有可能改变它。

答案 2 :(得分:0)

使用此技巧,Upsert非常简单。你只需检查它是否有_id属性:

if(item._id){
  //update
}else{
  //insert
}