1

我很难弄清楚如何使用带有 Mongomatic 的原子“$set”运算符来更新 MongoDB 文档。我很确定这是我遇到问题的 Mongo 标准/更新语言,而不是 Mongomatic,但我愿意被证明是错误的。

带有独立、可运行脚本的要点的链接在这里:https ://gist.github.com/3835672

我开始创建一个如下所示的文档:

{"videos":[{"video_id":"video1"},{"video_id":"video2"}],"_id":{"$oid": "506ddd53a114604ce3000001"}}

我可以使用使用 Mongomatic 实例化的模型获取该文档:

video_group = VideoGroup.find_one('videos.video_id' => 'video1')

然后我试图通过这样做来设置一个“视图”字段:

video_group.update!({ 'videos.video_id' => 'video1' }, '$set' => { 'videos.$.views' => 123 })

这就是 Mongo 爆炸的地方,出现以下错误:

can't append to array using string field name [$]

我知道这是 StackOverflow 上一个非常常见的问题。我普遍理解问题是位置运算符没有得到任何匹配。但是,即使阅读了数十条回复,我仍然无法弄清楚如何以一种有效的方式表达这种说法。

我刚开始使用错误的数据结构吗?

4

1 回答 1

1

事实上,这是一个单数问题。您需要将选项 {:multi => true} 传递给底层 mongo ruby​​ 驱动程序,并包括您的标准以及发送到 mongodb 的更新的特定 _id,而不是作为可选参数的一部分。看起来像 mongomatic 中的错误。这是我用来找到它的 ruby​​ 调试器记录:https ://gist.github.com/3836797

请注意,我对您发布的文件进行了更改,debugger在第 41 行之前添加了一行,并将第 42-44 行更改为:

video_group.update!({ 'videos.video_id' => 'video1', :multi => true }, '$set' => {
  'videos.$.views' => 123,
})
于 2012-10-04T22:13:17.000 回答