Почему агрегирование отфильтрованного набора данных теряет его фильтры? - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть эта коллекция:

// collection
[
  {_id: 1, name: 'Luigi', childs: [{name: 'one'}, {name: 'two'}], dad_id: 9]},
  {_id: 1, name: 'Mario', childs: [{name: 'four'}, {name: 'five'}], dad_id: 8]},
  {_id: 1, name: 'Alessandro', childs: [{name: 'seven'}, {name: 'six'}], dad_id: 9]},
]

и я применяю к ней этот фильтр

result = collection.find({ dad_id: 9 })

Затем я хочу объединить результаты и получить все дочерние элементы по отдельности, я начинаю с раскручиванияих (тогда я сделаю прогноз и т. д.), но я уже столкнулся с поведением, которое я не понимаю: результат содержит также документы с dad_id равным 8, даже если они уже были исключены моим запросом.

result.aggregate([
  { "$unwind"=> "$childs" },
]).each do |e| ... end
// => [
  {_id: 1, name: 'Luigi', childs: {name: 'one'}, dad_id: 9]},
  {_id: 1, name: 'Luigi', childs: {name: 'two'}, dad_id: 9]},
  {_id: 1, name: 'Luigi', childs: {name: 'five'}, dad_id: 8]},
  {_id: 1, name: 'Luigi', childs: {name: 'four'}, dad_id: 8]},
  {_id: 1, name: 'Luigi', childs: {name: 'seven'}, dad_id: 9]},
  {_id: 1, name: 'Luigi', childs: {name: 'six'}, dad_id: 9]},
]

Чего мне не хватает?

1 Ответ

0 голосов
/ 22 ноября 2018

Вы не можете вводить цепочку ввода из одного запроса в другой, как этот.

Либо используйте поисковый запрос ex.Model.find (id) или структура агрегации.

Структура агрегации предоставляет вам функциональность для создания конвейера (например, сопоставление, отмотка, поиск, проект).

Для использования индексации mongodb всегда старайтесь сначала использовать «$ match» в конвейере

match = { "$match" => { "dad_id" =>9} }
unwind = {"$uwind"=>"$childs"}
pipeline = [match,unwind]
collection.aggregate(pipeline).each do |obj|
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...