Подсчитать количество элементов, которые нужно получить из поискового запроса для вложенного ссылочного массива в mongodb - PullRequest
0 голосов
/ 17 января 2020

У меня есть следующая коллекция категорий

{
"_id" : ObjectId("5e1d8c3ed06661d2b06a7c46"),
    "status" : "active",
    "noOfLevels" : 3,
    "levels" : [ 
        ObjectId("5e1db2237a265cfe50dfdb18"), 
        ObjectId("5e1db22b7a265cfe50dfdb19"), 
        ObjectId("5e1db23b7a265cfe50dfdb1a")
    ],
    "name" : "Fuel",
},
{
 "_id" : ObjectId("5e1d8c3ed06661d2b06a7c46"),
    "status" : "active",
    "noOfLevels" : 3,
    "levels" : [ 
        ObjectId("5e1db2237a265cfe50dfdb18"), 
        ObjectId("5e1db22b7a265cfe50dfdb19"), 
        ObjectId("5e1db23b7a265cfe50dfdb1a")
    ],
    "name" : "Feeds",
}

На вышеприведенных уровнях коллекции _id был сохранен как ссылка для последующего заполнения.

Коллекция уровня содержит следующие элементы: -

{
 levelName: { type: String, required: true },
  levelDesc: { type: String },
  levelNo: { type: Number, required: true },
  categoryId: { type: Mongoose.Schema.Types.ObjectId, ref: 'trainingCategories', required: true },
  videoId: [{ type: Mongoose.Schema.Types.ObjectId, ref: 'trainingVideoMaster' }],
},
{
 levelName: { type: String, required: true },
  levelDesc: { type: String },
  levelNo: { type: Number, required: true },
  categoryId: { type: Mongoose.Schema.Types.ObjectId, ref: 'trainingCategories', required: true },
  videoId: [{ type: Mongoose.Schema.Types.ObjectId, ref: 'trainingVideoMaster' }],
}

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

Нужен такой результат, как этот : -

 {
                        name: 'How to save fuel',
                        catNo: 1,
                        noOfLevels: 3,
                        totalVideos: 4
    },
    {
                        name: 'Feeds',
                        catNo: 2,
                        noOfLevels: 3,
                        totalVideos: 3
     }

1 Ответ

1 голос
/ 17 января 2020

Вам необходимо $unwind массив trainingLevels, чтобы сделать его свойством объекта, и затем вы можете использовать нотацию .dot для получения длины videoId.

Cat.aggregate([
  { "$match": { "status": "active" } },
  { "$lookup": {
    "from": "traininglevels",
    "let": { "levels": "$levels" },
    "pipeline": [
      { "$match": { "$expr": { "$in": ["$_id", "$$levels"] }}},
      { "$group": {
        "_id": null,
        "totalVideos": { "$sum": { "$size": "$videoId" }}
      }}
    ]
    "as": "trainingLevels"
  }},
  { "$unwind": "$trainingLevels" },
  { "$project": {
    "noOfLevels": 1,
    "name": 1,
    "catNo": 1,
    "createdAt": 1,
    "trainingLevels": "$trainingLevels.totalVideos"
  }}
])
...