假设我有一个文档Person
,我想把Tags
添加到这个文档中。
所以我想要一个文档看起来像
{ "_id" : 5,
"tags" : ["Music", "Baseball", "Skiing"]
}
每当一个人选择了一个兴趣,我就把它添加到tags
列表中。
这是我的尝试:
require 'mongo'
client = Mongo::Connection.new
db = client['some_app']
coll = db['persons']
coll.update({_id: 5}, {"$push" => {tags: "PS4"}}, {upsert: true})
如果我运行这个,我得到一个异常:
/usr/local/rvm/gems/ruby-2.1.2/gems/bson-1.10.2/lib/bson/bson_c.rb:20:in `serialize': key $push must not start with '$' (BSON::InvalidKeyName)
我做错了什么?
它看起来很好,并为我工作。以下更详尽的测试适用于我,请看看它是否适用于你,它应该有助于澄清你的问题,我怀疑你在发帖时丢失了。
test_unit.rb:
require 'mongo'
require 'test/unit'
require 'json'
class MyTest < Test::Unit::TestCase
def setup
@coll = Mongo::MongoClient.new['some_app']['persons']
@coll.remove
end
test "BSON version" do
assert_equal("1.10.2", CBson::VERSION, "confirm loading of C extension and version")
end
test "$push to existing doc" do
json = %q{
{
"_id" : 5,
"tags" : ["Music", "Baseball", "Skiing"]
}
}
@coll.insert(JSON.parse(json))
@coll.update({_id: 5}, {"$push" => {tags: "PS4"}}, {upsert: true})
assert(@coll.find.to_a.first['tags'].include?('PS4'))
end
test "upsert and $push" do
@coll.update({_id: 5}, {"$push" => {tags: "PS4"}}, {upsert: true})
assert(@coll.find.to_a.first['tags'].include?('PS4'))
end
end
ruby -v test_unit.rb
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin12.0]
osprey:free-59705-mongo-push gjm$ ruby test_unit.rb
Loaded suite test_unit
Started
...
Finished in 0.019441 seconds.
3 tests, 3 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed
154.31 tests/s, 154.31 assertions/s