Как взять количество массивов на основе contentId - PullRequest
1 голос
/ 14 июля 2020

У меня ниже структура mongodb

    {
    "userId" : "5d3014fe56db690a5959a870",
    "contentId" : "1",
    "userAnswer" : {
        "uploads" : [
            "123",
            "456"
        ]
    }
},
{
    "userId" : "5d3014fe56db690a5959a8700",
    "contentId" : "1",
    "userAnswer" : {
        "uploads" : [
            "789"
        ]
    },

},
{
    "userId" : "5d3014fe56db690a5959a874",
    "contentId" : "2",
    "userAnswer" : {
    
        "uploads" : [
            null
        ]
    }
}

contentId имеет (userAnswer.uploads) 123, 456 и 789. Я хочу взять счет на основе contentId и pu sh в один новый массив.

Мой ожидаемый ответ.

 {
   _id: 1,
   totalCount : 3
 },
 {
    _id: 2,
   totalCount : 0
 }

Мой код

db.test.aggregate([


{ $project : { "contentID":"$contentId", "regularStudent" : "$userAnswer.uploads"} },

{ $group : { _id : "$contentID", regularStudent: { $push: "$regularStudent" } } },

{ $project: { "regularStudent": { "$reduce": { "input": "$regularStudent", initialValue: [], "in": { $concatArrays: [ "$$this", "$$value" ] } } } } },

{ $project: { totalStudent: { $cond: { if: { $isArray: "$regularStudent" }, then: { $size: "$regularStudent" }, else: "NA"} } } }

])

Мой вывод

/* 1 */`enter code here`
{
    "_id" : "2",
    "totalStudent" : 1
},

/* 2 */
{
    "_id" : "1",
    "totalStudent" : 3
}

MongoDb версии 3.4

я новый mongodb

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Существуют разные подходы к реализации этого варианта использования.

Я использовал оператор $ filter для проецирования массива userAnswer.uploads без значения null, а затем $size может использоваться для возврата правильного размера

db.collection.aggregate([
  {
    $project: {
      contentId: "$contentId",
      newArray: {
        $filter: {
          input: "$userAnswer.uploads",
          as: "u",
          cond: {
            $ne: [
              "$$u",
              null
            ]
          }
        }
      }
    }
  },
  {
    $project: {
      contentId: 1,
      totalStudent: {
        $size: "$newArray"
      }
    }
  },
  {
    $group: {
      _id: "$contentId",
      totalStudent: {
        $sum: "$totalStudent"
      }
    }
  }
])

См. рабочий пример здесь: Пн go Детская площадка

0 голосов
/ 14 июля 2020

[ null ] не пустой массив, это массив, содержащий 1 элемент, поэтому его размер действительно равен 1.

Если вам нужно исключить null элементов из массива, используйте $filter, вроде

{ $project: { 
    totalStudent: { 
        $cond: { 
            if: { $isArray: "$regularStudent" }, 
            then: { 
                $size: {
                     $filter: {
                          input: "$regularStudent" 
                          cond: {$not:{$eq:["$$this", null]}}
                     }
                }
            }, 
            else: "NA"
         } 
    } 
} }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...