Как использовать функцию агрегирования mongo db-query - PullRequest
0 голосов
/ 01 октября 2018

Я новичок в MongoDB, и я хотел бы использовать функцию агрегирования, где я хочу проверить type == topic и получить следующий вывод

Ожидаемый вывод

[
    {
        conceptName : 59d98cfd1c5edc24e4024d00
        totalCount : 2
    },
    {
        conceptName : 59d98cfd1c5edc24e4024d03
        totalCount : 1
    }
]

Пример ввода db.GroupContents

{
    "_id" : "5a0948bb1c5edc7a5000521a",
    "type" : "topic",
    "groupID" : "5a0948bb1c5edc7a5000521a",
    "pedagogyID" : "59d98cfa1c5edc24e40249a3",
   }

Пример ввода db.PedagogyNodes

{
    "_id" : "59d98cfa1c5edc24e40249a3",
    "latestVersion" : "59d98cfa1c5edc24e402497f_1",
    "createdAt" : "2017-10-08 04:27:06",
    "updatedAt" : "2017-10-08 04:27:06"
}

Пример ввода db.PedagogyVersions

    {
    "_id" : "59d98cfa1c5edc24e402497f_1",
    "type" : "topic",
    "contentNodes" : {
        "LearningNodes" : [
            "59d98cfd1c5edc24e4024d00",
            "59d98cfd1c5edc24e4024d03",
            "59d98cfd1c5edc24e4024d00",
        ]
    },
    "createdAt" : "2017-10-08 04:27:06",
    "updatedAt" : "2017-10-08 04:27:06"
}

То, что я пробовал до сих пор

var groupID = "5a0948bb1c5edc7a5000521a"; // Step 1
var records;
var pnDoc;
var pvDoc;
db.GroupContents.find({groupID : groupID}).forEach(function (doc){ // Step 2
   var pedagogyID = doc.pedagogyID;
   var records = db.getSiblingDB('PedagogyService');
       records.PedagogyNodes.find({_id : pedagogyID}).forEach(function (pnDoc) { // Step 3
          var latestVersion = pnDoc.latestVersion;
          // addded aggregate function here
          records.PedagogyVersions.aggregate([
            {
                $match:{_id:latestVersion} // Step 4
            },
            {
               $unwind:"$contentNodes.LearningNodes"
            },
            {
                $group:
                {
                    _id:"$contentNodes.LearningNodes",
                    count:{$sum:1}
                }
            }
        ])
      })
});

Я не могу написать запрос БД на основании моего ожидаемого ответа, пожалуйста, помогите.

Поймите мое требование

Step : 1 => I am passing `groupID = 5a0948bb1c5edc7a5000521a`
Step : 2 => we have to check from GroupContents where groupID = groupID then we have to take `pedagogyID`
Step : 3 => we have to check from PedagogyNodes where _id = pedagogyID then we have to take `latestVersion`
Step : 4 => we have to check from PedagogyVersions where _id = latestVersion then we have to take `contentNodes->LearningNodes`
Step : 5 => Finally we have to do the aggregation then we have display the result

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

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

records.PedagogyVersions.aggregate([
        {
            $match:{_id:latestVersion} // Step 4
        },
        {
           $unwind:"$contentNodes.LearningNodes"
        },
        {
            $group:
            {
                _id:"$contentNodes.LearningNodes",
                count:{$sum:1}
            }
        }
    ], function(err, results) {
         console.log(results);
    });
0 голосов
/ 01 октября 2018

Попробуйте размотать массив LearningNodes, а затем сосчитать их, сгруппировав их вместе

db.PedagogyNodes.aggregate([
    {
       $unwind:"$contentNodes.LearningNodes"
    },
    {
        $group:
        {
            _id:"$contentNodes.LearningNodes",
            count:{$sum:1}
        }
    }
])

Если вам нужно выполнить какие-либо совпадения, вы можете использовать $match stage

db.PedagogyNodes.aggregate([
    {
        $match:{type:"topic"}
    },
    {
       $unwind:"$contentNodes.LearningNodes"
    },
    {
        $group:
        {
            _id:"$contentNodes.LearningNodes",
            count:{$sum:1}
        }
    }
])

Ответ на отредактированный вопрос =>

Вы не смогли просмотреть вывод на консоли, так как mongoshell не выводит вывод скрипта на экран.Для этого сделайте следующее:

var result =  records.PedagogyVersions.aggregate([......]);

result.forEach(function(resultDoc){
    print(tojson(resultDoc))
})
...