【问题标题】:MongoDB Ruby atomic additive update issuesMongoDB Ruby 原子附加更新问题
【发布时间】:2012-05-25 14:33:51
【问题描述】:
coll.save({"_id" => "test", "1" => "a"}) #=> {"_id"=>"test", "1"=>"a"}
coll.update({"_id" => "test"}, {"$set"=>{"1.2" => "b"}}) #=> {"_id"=>"test", "1"=>"a"}

我期待最后一行会创建一个新节点:{"_id"=>"test", "1"=>{"2"=>"b"}}{"_id"=>"test", "1"=>["a",{"2" => "b"}]}

是否可以让它创建一个不存在的节点?如果已经有键:值对,则取消转换为数组?

还有一个:

coll.save({"_id" => "test", "1" => ["a"]}) #=> {"_id"=>"test", "1"=>["a"]}
coll.update({"_id" => "test"}, {"$set"=>{"1" => ["b"]}}) #=> {"_id"=>"test", "1"=>["b"]}

是否可以将值转换为数组而不覆盖它们?从而使以上: #=>{"_id"=>"test", "1"=>["a","b"]}

我这样说是因为我有大型数组,如果我下载数组并在 Ruby 端取消移位,则会产生性能开销。

对于第一个问题,集合中的文档有多种形状,在 ruby​​ 中构建一个 when:case 方法对于所有可能性来说都是很多开销/工作。

Ruby unshift:http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-unshift

::编辑::

$db.serverStatus().version
2.0.2

$gem list
mongo (1.6.2, 1.6.1, 1.5.2)

具体代码:

require 'pp'
require 'mongo'
coll = Mongo::Connection.new.db("test").collection("test")
coll.save({"_id" => "test", "1" => "a"})
pp coll.find_one("_id"=>"test") #=> {"_id"=>"test", "1"=>"a"}
coll.update({"_id" => "test"}, {"$set"=>{"1.2" => "b"}})
#Expect, but does not give: {"_id"=>"test", "1"=>{"2"=>"b"}}
pp coll.find_one("_id"=>"test") #=> {"_id"=>"test", "1"=>"a"} 

【问题讨论】:

  • 我无法重现您上面显示的第一个案例;您使用的是什么版本的 MongoDB?什么版本的 ruby​​ 驱动程序?
  • 最新,coll 是 collection 的缩写,抱歉没有具体说明。 coll = Mongo::Connection.new.db("test")我会尽快查看您的答案,感谢您的回复。而且输出也不完全是输出。我只是评论了存储到数据库中的内容,而不是保存/更新的输出,这是最小的。
  • 你能显示你正在使用的确切代码吗?此外,您可以通过在 mongo shell 中执行 db.serverStatus().version 来查找 MongoDB 的版本,并通过在终端中执行 gem list 来查找 ruby​​ 驱动程序的版本。
  • 已更新。你会重现不同的结果吗?
  • 当我尝试运行它时出现错误(添加了:safe => true,这会导致驱动程序发送捆绑的getLastError 命令)。

标签: ruby arrays mongodb ruby-1.9.3


【解决方案1】:

MongoDB 没有前置操作符,但它确实有两个操作符以原子方式追加到数组:$push,它无条件地追加到数组,和$addToSet,它只添加到数组中尚未包含要添加的元素。

【讨论】:

  • 这是完美的,关于第一个问题的任何想法,关于如何 $set 深度节点? "$set" => {"a.b.c" => "55"}
猜你喜欢
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
相关资源
最近更新 更多