Mongo返回一个查询

时间:2019-07-10 06:49:39

标签: ruby-on-rails mongodb mongoid

我有以下n到n个(用蒙古型宝石做),有两本藏书和出版商:

{
   name: "O'Reilly Media",
   founded: 1980,
   location: "CA",
   books: [123456789, 234567890, ...]
}

{
    _id: 123456789,
    title: "MongoDB: The Definitive Guide",
    author: [ "Kristina Chodorow", "Mike Dirolf" ],
    published_date: ISODate("2010-09-24"),
    pages: 216,
    language: "English"
}

{
   _id: 234567890,
   title: "50 Tips and Tricks for MongoDB Developer",
   author: "Kristina Chodorow",
   published_date: ISODate("2011-05-06"),
   pages: 68,
   language: "English"
}

我需要在一个查询中返回发布者,但将其分隔在文档中,如下所示:

{
   name: "O'Reilly Media",
   founded: 1980,
   location: "CA",
   book: 123456789 # or books:[123456789]
}
{
   name: "O'Reilly Media",
   founded: 1980,
   location: "CA",
   book: 234567890 # or books:[123456789
}

我想在查询中在mongo中进行此操作,实际上我在修改集合的rabl文件中进行了此操作,但这不是很好的por收获,并且不能用于其他表示形式中,所以我想在mongo中进行此转换,而不是在红宝石,或者也许我应该更改查询,而不是在出版商那里查询书籍。

这是ruby中的代码:

@publishers is a mongoid::Criteria

@publishers = @publishers.collect do |s|
  s.books.count > 1 ? s.publisher_separate_by_books : s
end.flatten

class Publisher
   has_and_belongs_to_many :books, inverse_of: :books, dependent: :nullify
 def publisher_separate_by_books
    books.map {|i| Publisher.new({name: name, founded: founded, location: location, books: [i]})} 
  end
end

如何在mongo查询中实现

1 个答案:

答案 0 :(得分:0)

像在数据库服务器(任何数据库服务器)中那样扩展查询结果没有优势。如果您想对查询中的每本书执行其他操作(在MongoDB的情况下,这将涉及聚合管道,而对于关系数据库的JOIN操作),则将是有意义的。但是简单地在数据库中扩展这样的字段是浪费的。

MongoDB确实通过展开(https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/#pipe._S_unwind)支持此操作,但是您将失去使用Mongoid提供的DSL查询模型的能力,而不得不构造聚合管道。