【问题标题】:Using collection-level operations in Mongoid在 Mongoid 中使用集合级操作
【发布时间】:2011-12-05 04:02:47
【问题描述】:

我正在试验 Ruby(我不太了解)和 Mongo(我做过)。我制作了一个带有 :accessed 字段的 Mongoid 模型。我知道在 Mongo 我可以运行类似的东西:

data = db.collection.findAndModify({
  query: { ... },
  update: {$inc: {accessed: 1}}
})

但是当我在 Mongoid 中运行 MyModel.collection.find_and_modify 时,我得到了看起来像哈希的东西。有没有办法可以将它强制转换为我的模型类的实例,或者在 Mongoid 中进行更好的支持查询?

【问题讨论】:

    标签: ruby mongodb mongoid


    【解决方案1】:

    find_and_modify默认返回hash,检查documentation

    参数:

    • opts (Hash)(默认为:{})- 一组可自定义的选项

    选项哈希(opts):

    • :query (Hash) — 默认值:{} — 用于匹配的查询选择器文档 所需的文件。
    • :update (Hash) — 默认值:nil — 对匹配文档执行的更新操作。
    • :sort (Array, String, OrderedHash) — 默认值:{} — 使用 Cursor#sort 可用的任何排序选项为查询指定排序选项。如果查询将匹配多个文档,则排序顺序很重要,因为只会更新和返回第一个匹配的文档。
    • :remove (Boolean) — 默认值:false — 如果为 true,则从集合中删除返回的文档。
    • :new (Boolean) — 默认值:false — 如果为 true,则返回更新后的文档;否则,返回更新前的文档。

    返回:

    • (哈希)——匹配的文档。

    但是您可以通过将哈希值作为参数传递来简单地初始化模型来将哈希值转换为您的集合对象

     >> x = MyModel.collection.find_and_modify(:query => {...},:update => {...})
     >> x.class
     >> BSON::OrderedHash
     >> obj = MyModel.new(x)
     >> obj.class
     >> MyModel
    

    现在您可以对转换后的对象应用任何 mongoid 操作。它会完美运行。

    希望对你有帮助

    【讨论】:

    • 您好,我同时使用 Mongoid 和集合级别的操作来操作我的 mongodb,但是我无法使用像 Model 这样的 mongoid 活动记录操作来创建、保存或更新我的数据库.save、Model.update_attributes 等。您能提出任何解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    相关资源
    最近更新 更多