使用upsert时,我无法将新数据推送到数组中

时间:2015-06-11 05:55:39

标签: ruby mongodb

使用upsert

时,我无法将new_data推送到数组中

我如何使用upsert插入/更新一个文档?

history是一个数组。

顺便说一句,gem mongo的数据'似乎远不如PythonJavascript那么受欢迎。

gem mongo的功能是否比其他语言少,并且有更多错误?

  

ArgumentError:参数个数错误(3个为1..2)

[64] pry(#<Scoot>)> @db.data_collection.find({_id: data[:_id]}).update_one(
[64] pry(#<Scoot>)*   {data: data,
[64] pry(#<Scoot>)*     from: from_city,
[64] pry(#<Scoot>)*   },
[64] pry(#<Scoot>)*   {:$push => { "history" => new_data }},
[64] pry(#<Scoot>)*   :upsert => true,
[64] pry(#<Scoot>)*   :safe => true
[64] pry(#<Scoot>)* )
ArgumentError: wrong number of arguments (3 for 1..2)
  

Mongo :: Error :: OperationFailure:'$ push'中的美元($)前缀字段'$ push'对存储无效。 (52)

@db.data_collection.find({_id: data[:_id]}).update_one(
  {data: data,
    from: from_city,
    :$push => { "history" => new_data },
    },
  :upsert => true,
  :safe => true
)

更新GEM MONGO 2.0.4

collection.find({_id: data[:_id]}).update_one(
  {
    "$set" => {
      "city" => from_city
    },
    "$push": => { "history" => new_data }
  },
  :upsert => true
)

错误

SyntaxError: unexpected tSTRING_DEND, expecting end-of-input
[105] pry(#<Scoot>)> :upsert => true
SyntaxError: unexpected =>, expecting end-of-input
:upsert => true
          ^
[105] pry(#<Scoot>)> )
SyntaxError: unexpected ')', expecting end-of-input

1 个答案:

答案 0 :(得分:1)

假设您在此处使用2.X驱动程序系列。问题主要是不支持:$push语法,所以你用不同的方式编写它。此外,:safe在您阅读的任何地方都会被弃用。另外,如果要设置对象的特定字段,请使用"$set

@db.data_collection.find({ _id: data[:_id]}).update_one({
      "$set" => { 
          "data" => data,
          "city" => from_city
      },
      "$push" => { "history" => new_data }
  },
  :upsert => true
) 

请参阅update_one

的文档