【问题标题】:Retrieving a Subset of Fields from MongoDB in Ruby在 Ruby 中从 MongoDB 中检索字段的子集
【发布时间】:2011-05-25 18:47:34
【问题描述】:

我正在尝试使用 Ruby 中的查询从 MongoDB 获取字段子集,但它似乎不起作用。它不返回任何结果

这是红宝石代码:

coll.find("title" => 'Halo', :fields => ["title", "isrc"]) #this doesn't work

如果我删除字段哈希,它会起作用,返回所有字段的结果

coll.find("title" => 'Halo') #this works

查看 mongodb 控制台,第一个查询在 mongodb 服务器上结束,如下所示:

{ title: "Halo", fields: [ "title", "isrc" ] }

如果我尝试从 mongo 客户端控制台进行查询,它会起作用,我会得到结果和子集。我这样查询:

db.tracks.find({title: 'Halo'}, {title:1,isrc:1})

可能是什么问题?几个小时以来,我一直在寻找解决方案。

【问题讨论】:

  • 你可以试试:coll.find({"title" => 'Halo'}, :fields => ["title", "isrc"])
  • 请注意,当前的 ruby​​ 驱动程序将选项键的名称从 :fields 更改为 :projectionapi.mongodb.org/ruby/current/Mongo/…

标签: ruby mongodb subset


【解决方案1】:

截至 2015 年 9 月,这些其他答案已过时。需要使用投影方式:#projection(hash)

coll.find({"title" => 'Halo'}).projection({title: 1, isrc: 1})

【讨论】:

  • coll.find({"title" => "Halo"},{projection: {title: 1, isrc: 1}})
【解决方案2】:

查询应该是这样的

collection.find(selector = {}, opts = {})

Query the database

在你的情况下是

coll.find({"title" => 'Halo'}, {:fields => ["title", "isrc"]})

但仍然存在问题,ruby-driver 忽略了“字段”的条件,并返回所有字段! :\

【讨论】:

  • 这对我有用,红宝石驱动程序没有忽略“字段”选项。谢谢!
  • 是的,我弄错了,ruby 驱动程序不会忽略 :fields 选项。本期ODM,我用的是Mongoid,但在MongoMapper中也有。你可以阅读这个问题here
  • 请注意,根据 MongoDB 文档,您总是会得到 _id,除非您使用字段否定明确排除它。 mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields
  • 最新的 ruby​​ 驱动程序(如链接)将 fields 选项名称更改为 projection。所以当然fields 键被忽略了。
  • @Vladimir 在 Mongoid 中使用 Model.only(:title, :isrc).where(...) 并且它会正确构造您的对象,但如果您尝试访问另一个字段则抛出
【解决方案3】:

此查询将只返回标题为“Halo”的文档的标题和 isrc:

coll.find({"title" => 'Halo'},{:fields => {"_id" => 0, "title" => 1, "isrc" => 1}})

请注意对键是字段名称且值为 1 或 0 的字段使用哈希,具体取决于您是要包含还是排除给定字段。

【讨论】:

  • 谢谢 - 我一直在尝试寻找如何使用 Ruby 驱动程序否定字段(指定不返回 _id 字段的投影)。对于 Ruby 驱动程序,这似乎没有很好的记录。
【解决方案4】:

您可以使用以下查询

coll.find({"title" => 'Halo'}).projection({title: 1, isrc: 1, _id: 0})

如果你不想要_id,以防万一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多