Как объединить две таблицы в mongodb и вставить в массив - PullRequest
0 голосов
/ 13 декабря 2018

Здесь у меня две коллекции Organizations & Groups, мое требование - я хочу проверить oldOrgID в таблице Организации, и мне нужно взять schoolCode & schoolName и нажать mainData до iзавершено,

Теперь мой вопрос - таблица Organizations, я должен взять orgID, и я должен проверить Groups таблицу otherIds.orgID, если предположим, что совпадение означает, что я должен взять nameв Groups таблица вставляется в mainData

Организации:

{
    "_id" : ObjectId("5c11efebd9cb4d35f47d6bd0"),
    "orgID" : "5b6c82462fb9ca35444d0ba2",
    "name" : "The Punjab Public School",
    "oldOrgID" : "176348"
}

Группы:

/* 1 createdAt:12/13/2018, 11:06:02 AM*/
{
    "_id" : ObjectId("5c11efc2d9cb4d35f47d6bcf"),
    "groupID" : "2",
    "name" : "8 B",
    "otherIds" : {
        "orgID" : "ORG1"
    },
    "version" : NumberInt(1)
},

/* 2 createdAt:12/13/2018, 11:05:08 AM*/
{
    "_id" : ObjectId("5c11ef8cd9cb4d35f47d6bce"),
    "groupID" : "1",
    "name" : "8 A",
    "otherIds" : {
        "orgID" : "ORG1"
    },
    "version" : NumberInt(1)
}

Мой код

 var mainData = {};
var schoolCode = 176348 ;

db.Organizations.find({"oldOrgID" : schoolCode})
// .limit(1)
// .skip(15)
.forEach(function(doc){
    var OrgID = doc.orgID;
    if(mainData[OrgID] === undefined )
    {
      mainData[OrgID] = {}; // org name undefined means we are making empty object here
    }  
     mainData[OrgID]['schoolCode']  = doc.oldOrgID;
     mainData[OrgID]['schoolName']  = doc.name;

});
mainData

Получение вывода

{
    "5b6c82462fb9ca35444d0ba2" : {
        "schoolCode" : "176348",
        "schoolName" : "The Punjab Public School"
    }
}

Ожидаемый результат

{
    "5b6c82462fb9ca35444d0ba2" : {
        "schoolCode" : "176348",
        "schoolName" : "The Punjab Public School",
        "group-section" : 
                    [
                            {
                                "name" : "8 B"
                            },
                            {
                                "name" : "8 A"
                            }
                    ]
    }
}

Код агрегации

    db.Organizations.aggregate([
  {
    $match: {
      oldOrgID: "176348"
    }
  },
  {
    $lookup: {
      from: "Groups",
      localField: "orgID",
      foreignField: "otherIds.orgID",
      as: "group-section"
    }
  },
  {
    $project: {
      "group-section._id": 0,
      "group-section.groupID": 0,
      "group-section.otherIds": 0,
      "group-section.version": 0
    }
  }
])

Выход

    {
    "_id" : ObjectId("5c11efebd9cb4d35f47d6bd0"),
    "orgID" : "5b6c82462fb9ca35444d0ba2",
    "name" : "The Punjab Public School",
    "oldOrgID" : "176348",
    "group-section" : [ ]
}

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

$ lookup - один из этапов конвейерного запроса агрегации, поэтому вам нужно использовать запрос агрегации Mongo как:

db.collection.aggregate([
  {
    $match: {
      oldOrgID: "176348"
    }
  },
  {
    $lookup: {
      from: "other",
      localField: "orgID",
      foreignField: "otherIds.orgID",
      as: "group-section"
    }
  },
  {
    $project: {
      "group-section._id": 0,
      "group-section.groupID": 0,
      "group-section.otherIds": 0,
      "group-section.version": 0
    }
  }
])
0 голосов
/ 13 декабря 2018

Вы можете попробовать Aggregate Query и использовать операцию

LOOKUP:

Подробнее: https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

Вы можете что-то вроде этого:

db.Organizations.aggregate([{
   $lookup:
     {
       from: "Groups" // <collection to join>,
       localField: "oldOrgID"  // <field from the input documents>,
       foreignField: "otherIds.orgId" // <field from the documents of the "from" collection>,
       as: "group-section" <output array field>
     }
}]);

Надеюсь, это даст вам представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...