агрегатная функция для расчета размера массива после удаления пустого значения в массиве - PullRequest
1 голос
/ 13 апреля 2019

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

db.students.aggregate({$project : { title:1 ,_id : 0,  count: {$size : "$grades"}}},{$match: {"count": {$gt:4}}})

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

db.students.aggregate({$project : { title:1 ,_id : 0,  count: {$size : "$grades"}}},{$match: {"count": {$gt:4},grades : {$ne:''}}})

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

Давайте объясним это пошагово различными запросами:

Все возможные значения в коллекции grades:

> db.grades.find()
    { "_id" : ObjectId("5cb2ff50d33f6ed856afe577"), "title" : "abc", "grades" : [ 12, 23, 1 ] }
    { "_id" : ObjectId("5cb2ff55d33f6ed856afe578"), "title" : "abc", "grades" : [ 12, 23 ] }
    { "_id" : ObjectId("5cb2ff5cd33f6ed856afe579"), "title" : "abc", "grades" : [ 12, 23, 10, 100, 34 ] }
    { "_id" : ObjectId("5cb2ff63d33f6ed856afe57a"), "title" : "abc", "grades" : "" }
    { "_id" : ObjectId("5cb2ff66d33f6ed856afe57b"), "title" : "abc", "grades" : [ ] }
    { "_id" : ObjectId("5cb2ff6bd33f6ed856afe57c"), "title" : "abc", "grades" : [ 1, 2, 3, 4, 5 ] }

Простоотфильтрованные пустые записи оценок:

> db.grades.aggregate([{$match: {grades: {$ne:''}} }])

    { "_id" : ObjectId("5cb2ff50d33f6ed856afe577"), "title" : "abc", "grades" : [ 12, 23, 1 ] }
    { "_id" : ObjectId("5cb2ff55d33f6ed856afe578"), "title" : "abc", "grades" : [ 12, 23 ] }
    { "_id" : ObjectId("5cb2ff5cd33f6ed856afe579"), "title" : "abc", "grades" : [ 12, 23, 10, 100, 34 ] }
    { "_id" : ObjectId("5cb2ff66d33f6ed856afe57b"), "title" : "abc", "grades" : [ ] }
    { "_id" : ObjectId("5cb2ff6bd33f6ed856afe57c"), "title" : "abc", "grades" : [ 1, 2, 3, 4, 5 ] }

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

> db.grades.aggregate([{$match: {grades: {$ne:''}} }, {$project: {_id:0, title:1, count: {$size: "$grades"}  } }])

    { "title" : "abc", "count" : 3 }
    { "title" : "abc", "count" : 2 }
    { "title" : "abc", "count" : 5 }
    { "title" : "abc", "count" : 0 }
    { "title" : "abc", "count" : 5 }

Теперь сопоставьте требуемое условие числа массивов оценок больше 4, как показано ниже:

> db.grades.aggregate([{$match: {grades: {$ne:''}} }, {$project: {_id:0, title:1, count: {$size: "$grades"}  } }, {$match: {count: {$gte: 4}}}  ])

    { "title" : "abc", "count" : 5 }
    { "title" : "abc", "count" : 5 }
    > 
0 голосов
/ 14 апреля 2019

Вы можете использовать $ filter для удаления пустого grades перед запуском $size:

db.students.aggregate([
    {$project : { title:1 ,_id : 0,  count: { $size : { $filter: { input: "$grades", cond: { $ne: [ "$$this", '' ] } } }}}},
    {$match: {"count": {$gt:4}}}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...