Meteor MongoDB Фильтрует родительские записи по дочерним полям - PullRequest
0 голосов
/ 29 января 2020

Как бы я go отфильтровал набор записей на основе их дочерних записей.

Допустим, у меня есть коллекция Item, в которой есть поле для другой коллекции Bag, называемое bagId , Я хотел бы найти все Items, где поле в Bags соответствует некоторому предложению.

Т.е. db.Items.find( { "where bag.type:'Paper' " }). Как бы я go сделал это в MongoDB. Я понимаю, что мне нужно join на Bags, а затем связать, где Item.bagId == Bag._id

Я использовал Studio3T для преобразования SQL GROUP BY в Mon go агрегат. Мне просто интересно, есть ли какой-нибудь дефакто способ сделать это.

  1. Должен ли я выполнять миграцию данных, чтобы просто включить Bag.type в каждый Item документ (не хочу привыкать постоянно вносить изменения в схему каждый раз, когда я хочу отсортировать / фильтр Items по Bag полям).

  2. Используйте что-то вроде https://github.com/meteorhacks/meteor-aggregate (пока с этим синтаксисом не повезло)

  3. Графограф https://github.com/cult-of-coders/grapher Я немного поиграл с этим, и хотя это круто, я не уверен, что это действительно решит мою проблему. Я могу использовать его для добавления Bag.type к каждому возвращенному элементу, но я не понимаю, как это могло бы помочь мне отфильтровать каждый элемент по Bag.type.

Является ли это только одним из компромиссы использования No SQL дБмс? Какой вариант выше рекомендуется или есть другие идеи?

Спасибо

1 Ответ

1 голос
/ 30 января 2020

Вы можете использовать $ в функциональности MongoDB. Это выглядело бы примерно так:

const bagsIds = Bags.find({type: 'paper'}, {fields: {"_id": 1}}).map(function(bag) { return bag._id; }); const items = Items.find( { bagId: { $in: bagsIds } } ).fetch();

Потребовалось бы некоторое тестирование, если бы реакционная способность этого раствора все еще была такой, как вы ожидаете, и если она все еще будет подходить для больших коллекций вместо того, чтобы искать первое решение и выполнять миграцию.

...