Есть ли какое-либо значение заполнителя, которое можно использовать в поиске агрегации MongoDB, чтобы найти правильное поле в объекте объектов? - PullRequest
0 голосов
/ 16 мая 2019

У меня есть две коллекции, где у первой есть внешние ключи второй коллекции.Теперь я хочу объединить совпадающие данные второй коллекции.Проблема в том, что я не знаю, как правильно определить путь к localField, потому что он находится в объекте объектов.В какой-то момент он будет изменен на массив объектов, но сейчас я должен разобраться с этим.Структуры коллекции выглядят следующим образом:

collectionOne

{
  _id: ObjectId('...'),
  groups: {
    '1': {
      things: [{
        id: xyz,
        foreignId: ObjectID('001') // id of collectionTwo
      }]
    },
    '2': {
      things: [{
        id: zyx,
        foreignId: ObjectId('001') // id of collectionTwo
      }]
    },
  }
}

collectionTwo

{
  _id: ObjectID('001').
  ...
}

Я прочитал документы и искал здесь и в других местах, но я не сталНе могу найти ни одного подходящего случая.Для массивов, которые я знаю, мне не нужно указывать фактическое место в массиве.Поэтому, если groups также будет массивом объектов, я мог бы просто использовать оператор точки следующим образом:

collectionOne.aggregate([
      {$match: {_id, ObjectID('...')},
      {$lookup: {
        from: 'collectionTwo',
        localField: 'groups.things.foreignId',
        foreignField: '_id',
        as: 'aggregatedThings'
      }},
    ])

Так что я хочу задать localField путь, который соответствует каждому объекту в groups.Примерно так: $ является заполнителем для каждого ключа:

collectionOne.aggregate([
      {$match: {_id, ObjectID('...')},
      {$lookup: {
        from: 'collectionTwo',
        localField: 'groups.$.things.foreignId',
        foreignField: '_id',
        as: 'aggregatedThings'
      }},
    ])

Надеюсь, моя проблема ясна.Ценю любую помощь.:)

1 Ответ

0 голосов
/ 11 июня 2019

Я нашел решение для этого.

collectionOne.aggregate([
      {$match: {_id, ObjectID('...')},
      { '$addFields': {
        'groupsArray': { $objectToArray: '$groups' }
      }},
      {$lookup: {
        from: 'collectionTwo',
        localField: 'groupsArray.v.things.foreignId',
        foreignField: '_id',
        as: 'aggregatedThings'
      }},
    ])

Преобразование объекта в массив с помощью $objectToArray помогает мне.

...