Найти документ и на него ссылаются документы - PullRequest
0 голосов
/ 25 сентября 2019

Я получаю команду throw, пытаясь заполнить связанные поля, используя конвейер агрегации в mongodb, простые отношения также работают (я имею в виду ссылку oid на oid в другой коллекции), но что происходит, когда у вас есть массив объектов, на который ссылается одно из его свойстввложенный документ.Если бы мне было непонятно, вот небольшое представление.

Предположим, у меня есть следующая схема:

Profile {
    _id: {
        type: mongoose.Schema.Types.ObjectId
    },
    Gender: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "Gender"
    },
    PhoneNo: [
        Value: {
            type: String
        },
        PhoneType: {
            type: mongoose.Schema.Types.ObjectId,
            ref: "PhoneType"
        }
    ]
}

PhoneType {
    _id: {
        type: mongoose.Schema.Types.ObjectId
    },
    Name: {
        type: String
    }
}

Gender {
    _id: {
        type: mongoose.Schema.Types.ObjectId
    },
    Name: {
        type: String
    }
}

Итак, я хотел бы получить результаты вроде:

    {
        _id: $oid,
        Gender: {Value:"Masculine"},
        PhoneNo: {
            Value: "000000",
            PhoneType: {
                _id: $oid
                Name: "Cell"
            }
        }
    },
    {
        _id: $oid,
        Gender: {Value:"Feminine"},
        PhoneNo: {
            Value: "999999",
            PhoneType: {
                _id: $oid
                Name: "Work"
            }
        }
    }

Lookup в Gender работает хорошо, но когда я пытаюсь найти PhoneNo, я теряю свойство value .

Что я получаю:

Обратите внимание на поле / свойство Значение , потеряно.

    {
       _id: $oid,
       Gender: {Value:"Masculine"},
       PhoneNo: [{
         PhoneType: {
            _id: $oid
            Name: "Cell"
         }
       }]
    },

    {
       _id: $oid,
       Gender: {Value:"Feminine"},
       PhoneNo: [{
         PhoneType: {
            _id: $oid
            Name: "Work"
         }
       }]
    }

Вот код, который я использовал:

{
  from: 'PhoneType',
  'let': {"ids":"$PhoneNo.PhoneType"},
  "pipeline": [
    { "$match": { "$expr": { "$in": ["$_id", "$$ids"] } } },
  ],
  as: "PhoneNo"
}

Как я могу это сделать?: S

1 Ответ

1 голос
/ 25 сентября 2019

Так что это пошаговое руководство для вашей проблемы, мы также включаем значения в декларацию lookup let, это будет массив, потому что он хранится в массиве, а на этапе проекта мы получим indexOf массив значений, где $$ ROOT 'idи идентификатор совпадают

https://mongoplayground.net/p/UUXus3N3ncw

Входные коллекции:

"user": [
    {
      _id: {
        type: "1"
      },
      Gender: 12,
      PhoneNo: [
        {
          Value: "name",
          PhoneType: 21
        },
        {
          Value: "name2",
          PhoneType: 212
        }
      ]
    }
  ],
  "gender": [
    {
      "_id": 12,
      "Name": "Male"
    }
  ],
  "PhoneType": [
    {
      "_id": 21,
      name: "Sus",
      val: "750"
    },
    {
      "_id": 212,
      name: "Suss",
      val: "7500"
    }
  ]

Совокупный конвейер:

user.aggregate([
  {
    $lookup: {
      from: "PhoneType",
      "let": {
        "ids": "$PhoneNo.PhoneType",
        "val": "$PhoneNo.Value",

      },
      "pipeline": [
        {
          "$match": {
            "$expr": {
              "$in": [
                "$_id",
                "$$ids"
              ]
            }
          }
        },
        {
          $project: {
            _id: 0,
            Value: {
              $arrayElemAt: [
                "$$val",
                {
                  $indexOfArray: [
                    "$$ids",
                    "$$ROOT._id"
                  ]
                }
              ]
            },
            PhoneType: "$$ROOT"
          }
        }
      ],
      as: "PhoneNo"
    }
  }
])

Результат вывода:

[
  {
    "Gender": 12,
    "PhoneNo": [
      {
        "PhoneType": {
          "_id": 21,
          "name": "Sus",
          "val": "750"
        },
        "Value": "name"
      },
      {
        "PhoneType": {
          "_id": 212,
          "name": "Suss",
          "val": "7500"
        },
        "Value": "name2"
      }
    ],
    "_id": {
      "type": "1"
    }
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...