我想使用如下所示的 mongo-ruby-driver 插入一个文档 -

id = "#{params[:id]}:#{Time.now.strftime("%y%m%d")}"
# db.collection('metrics').insert({'_id' => id})
db.collection('metrics').update(
  { '_id' => id },
  { '$inc' => { "hits" => 1 } },
  { 'upsert' => true }
)

现在这只会更新现有文档,如果不存在则不会创建。它执行这两个操作的唯一方法是取消注释它上面的 insert() 命令。

如果我使用 mongo 控制台并尝试直接执行此 upsert(不需要 insert() ),它会按预期工作。

最佳答案

您应该在 params 中使用符号而不是字符串。此代码有效。

db.collection('metrics').update(
  { '_id' => id },
  { '$inc' => { "hits" => 1 } },
  { :upsert => true }
)

事实上,您可以在大多数地方使用符号。这也有效:
db.collection(:metrics).update(
  { :_id => id },
  { :$inc => { :hits => 1 } },
  { :upsert => true }
)

关于ruby-on-rails - 当有自定义 _id 时,mongo-ruby-driver 不会在 upsert 上创建新文档,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9298039/

10-14 04:01