MongoDB присоединяется к объекту с помощью DBRef с массивом

#mongodb #mongodb-query #aggregation-framework

#mongodb #mongodb-запрос #агрегация-фреймворк

Вопрос:

Здравствуйте, я пытаюсь присоединиться к документам в другой коллекции с

 $lookup: {
  from: 'operation',
  localField: 'operations._id',
  foreignField: '_id',
  as: 'string'
}
 

я пробую все, но ничего не получается, я бы хотел, чтобы все операции внутри операций были связаны с идентификатором.

это мой первый документ введите описание изображения здесь

это мой второй документ введите описание изображения здесь

Комментарии:

1. Пожалуйста, отправьте образец json, к которому вы хотите присоединиться?

2. DBRef не является реальным типом. Вам нужно спуститься в него самостоятельно, используя подразделы $ref и $ id.

Ответ №1:

Вам нужно только заменить

 localField: 'operations._id'
 

с:

 localField: 'operations.$id',
 

Вот что я пробовал:

  1. Вставка некоторых операций:
      db.insert.Operation([
       {
         operationName: "test",
         data: [1, 2, 3],
       },
       {
         operationName: "xx",
         data: [4, 5, 6],
       },
       {
         operationName: "AA",
         data: [7, 8, 9],
       },
       {
         operationName: "CCC",
         data: [10, 11, 12],
       },
       {
         operationName: "PPP",
         data: [13, 14, 15],
       },
       {
         operationName: "IIII",
         data: [16, 17, 18],
       },
     ]);
     
  2. Вставив первый документ, я вызвал коллекцию Employee :
      db.insert.Employee([
       {
         firstName: "chuck",
         ladtName: "Norris",
         enabled: true,
         operations: [
           {
             $ref: "Operations",
             $id: ObjectId("6044ebeede8ee738e720d3a5"),
           },
           {
             $ref: "Operations",
             $id: ObjectId("6044ebeede8ee738e720d3a6"),
           },
           {
             $ref: "Operations",
             $id: ObjectId("6044ebeede8ee738e720d3a8"),
           },
           {
             $ref: "Operations",
             $id: ObjectId("6044ebeede8ee738e720d3a9"),
           },
           {
             $ref: "Operations",
             $id: ObjectId("6044ebeede8ee738e720d3aa"),
           },
         ],
       },
     ]);
     
  3. Я написал этот запрос:
      db.Employee.aggregate([{
         $lookup:{
             from:"Operation",
             localField:"operations.$id",
             foreignField:"_id",
             as:"Result"
         }
     }])
     

и это все, что нужно для этого.

Вот результат:

 { 
    "_id" : ObjectId("6044eee6de8ee738e720d3ab"), 
    "firstName" : "chuck", 
    "ladtName" : "Norris", 
    "enabled" : true, 
    "operations" : [
        DBRef("Operations", ObjectId("6044ebeede8ee738e720d3a5")), 
        DBRef("Operations", ObjectId("6044ebeede8ee738e720d3a6")), 
        DBRef("Operations", ObjectId("6044ebeede8ee738e720d3a8")), 
        DBRef("Operations", ObjectId("6044ebeede8ee738e720d3a9")), 
        DBRef("Operations", ObjectId("6044ebeede8ee738e720d3aa"))
    ], 
    "Result" : [
        {
            "_id" : ObjectId("6044ebeede8ee738e720d3a5"), 
            "operationName" : "test", 
            "data" : [
                1.0, 
                2.0, 
                3.0
            ]
        }, 
        {
            "_id" : ObjectId("6044ebeede8ee738e720d3a6"), 
            "operationName" : "xx", 
            "data" : [
                4.0, 
                5.0, 
                6.0
            ]
        }, 
        {
            "_id" : ObjectId("6044ebeede8ee738e720d3a8"), 
            "operationName" : "CCC", 
            "data" : [
                10.0, 
                11.0, 
                12.0
            ]
        }, 
        {
            "_id" : ObjectId("6044ebeede8ee738e720d3a9"), 
            "operationName" : "PPP", 
            "data" : [
                13.0, 
                14.0, 
                15.0
            ]
        }, 
        {
            "_id" : ObjectId("6044ebeede8ee738e720d3aa"), 
            "operationName" : "IIII", 
            "data" : [
                16.0, 
                17.0, 
                18.0
            ]
        }
    ]
}