【问题标题】:Meteor upsert equivalentMeteor upsert 等效
【发布时间】:2012-11-03 04:40:33
【问题描述】:

upsert 命令多久会在 Meteor 中实现?

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

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

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

【问题讨论】:

  • 使用您的解决方案,请注意,如果两个单独的客户端同时执行 findOne(),则会创建两个带有 {title:'Foo'} 的文档。
  • 是的,那么 upsert 的流星实现将是理想的。因为如果两个客户端使用相同的数据运行 upsert,他们会在他们的客户端模拟数据库上创建单独的文档;然后当两个文档在服务器上运行时,流星会同步它们。不过,它可能会有点麻烦……我明白为什么它还没有实现。

标签: mongodb meteor upsert


【解决方案1】:

upsert 命令多久会在 Meteor 中实施?

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

v0.6.6

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

来源:History.md

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

--原始答案如下--

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

它目前在“稍后”列表中,这意味着它需要一段时间才能实施,除非它获得大量选票。

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


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

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

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

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

这两种解决方案的核心是相同的,优雅地处理错误情况。 #1 更容易实现。 #2 在如何处理乐观并发方面具有更大的灵活性。

【讨论】:

  • Upsert 功能现已内置。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    Upsert 使用这个技巧真的很容易。您只需检查它是否具有_id 属性:

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

    【讨论】:

      猜你喜欢
      • 2013-11-02
      • 2017-06-12
      • 2018-03-05
      • 2023-03-09
      • 2018-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      相关资源
      最近更新 更多