Монго возврат в одном запросе - PullRequest
0 голосов
/ 10 июля 2019

У меня есть следующие n (n с mongoid gem) с двумя коллекциями книг и издателей:

{
   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, модифицируя коллекцию, но это не очень хорошо для получения и использования в других представлениях, поэтому я хочу сделать это преобразование в Mongo, а не в ruby, или, может быть, я должен изменить запрос к книгам вместо издателей.

Это код в 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

Как этого добиться в монго-запросе

1 Ответ

0 голосов
/ 12 июля 2019

Нет никакого преимущества в расширении результата запроса, подобного таковому на сервере базы данных (любом сервере базы данных).Если вы хотите выполнить дополнительные операции для каждой книги в запросе (что в случае MongoDB потребует конвейер агрегации и для операций JOIN для реляционных баз данных), то это будет иметь смысл.Но простое расширение такого поля в базе данных бесполезно.

MongoDB поддерживает эту операцию через размотку (https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/#pipe._S_unwind),, но тогда вы теряете возможность запрашивать модели, используя DSL, предоставленный Mongoid, ивместо этого построить агрегационные трубопроводы.

...