我有以下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查询中实现
答案 0 :(得分:0)
像在数据库服务器(任何数据库服务器)中那样扩展查询结果没有优势。如果您想对查询中的每本书执行其他操作(在MongoDB的情况下,这将涉及聚合管道,而对于关系数据库的JOIN操作),则将是有意义的。但是简单地在数据库中扩展这样的字段是浪费的。
MongoDB确实通过展开(https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/#pipe._S_unwind)支持此操作,但是您将失去使用Mongoid提供的DSL查询模型的能力,而不得不构造聚合管道。