0

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)

私は何を間違っていますか?

4

1 に答える 1

2

それは私にはうまく見え、私にとってはうまくいきます。次のより徹底的なテストは私にとってはうまくいきます。それがうまくいくかどうか見てください。

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
于 2014-08-04T16:01:26.380 に答える