Mongodb сортировать по порядку другого массива - PullRequest
1 голос
/ 09 января 2020

У меня есть пара связанных коллекций, давайте назовем их родительскими и дочерними.

Моя проблема в том, что я пытаюсь отсортировать родительские документы по полю child.name. Каждый дочерний документ также имеет поле parentId.

Я создал массив проекций, который отображает дочерние _ids на имена, и это в порядке сортировки, который я хочу (в алфавитном порядке по имени).

т.е.

Дочерние документы

 [
        {_id: "GiXtSJqg22aYf6h7r", name: "Allen"}
        {_id: "rRCiqcEAsDaDeJYL3", name: "Bob"}
        {_id: "bP2kKbsofyqKjp9Zq", name: "Chris"}
        {_id: "8so7KNeTwQGbLvwxo", name: "Darien"}
        {_id: "XZ7kMDSjae82ddi7p", name: "Edgar"}
        {_id: "k5j8LWTbWEStNhK5p", name: "Sally"}
]

Затем я хочу вернуть некоторые родительские документы, отсортированные по child.name, как показано выше. Родитель имеет childId, но не child.Name. Так что я думаю, что смогу понять это с помощью картографии.

Есть ли в любом случае сделать что-то вроде следующего ..

Parents.find({}, { sort: {childId: ORDER_OF_MAPPING._id} }

Таким образом, порядок сортировки " по возрастанию, основанный на порядке отображения ".

Я собираюсь сделать это без агрегации, так как я использую метод Meteor Publi sh для возврата курсора.

Есть идеи?

1 Ответ

0 голосов
/ 09 января 2020

Одним из способов решения этой проблемы является использование пакета herteby: denormalize для денормализации вашей базы данных примерно так:

ParentCollection.cache({
  type:'one',
  collection: ChildCollection,
  fields:['name'],
  referenceField:'childId',
  cacheField:'child'
})

Затем (после запуска миграция данных, необходимая для обновления вашей базы данных денормализованными полями), вы сможете сортировать документы ParentCollection по ключу child.name.

Денормализация повлияет на операции записи, которые будут стоить дороже (каждый раз, когда вы редактируете дочерний элемент пакет также изменяет родительский элемент), но тогда чтение может быть оптимизировано (меньше запросов для достижения того же результата).

В этом методе предполагается, что у одного родителя есть только один дочерний элемент (т. е. это один-к-одному одна связь между таблицами), которая, кажется, согласуется с сортировкой, которую вы описываете в своем вопросе

Еще один очень мощный пакет, который может вам помочь, - cultofcoders: grapher

...