MongoDB запрос даты агрегации - PullRequest
0 голосов
/ 26 марта 2019

Может ли кто-нибудь помочь мне с запросом на получение подсчета массива bal по дате> 2015-08-02 и по дате <2016-05-02? </p>

Моя коллекция:

{
"_id" : {
    "a" : "NA",
    "b" : "HXYZ",
    "c" : "12345",
    "d" : "AA"
},


   "bal" : [
 {
        "type" : "E",
        "date" : "2015-08-02"

},

{
        "type" : "E",
        "date" : "2017-08-01"


},
 {
        "type" : "E",
        "date" : "2016-07-07"


}

]}

Я пробовал следующий запрос:

db.getCollection(bal).aggregate([
{$match:{
        "_id_a" : "NA"
        }
    },

{
    $project: {
        "bal": 1, 
            lessThanDate: {
            $cond: [ {$lt:["$bal.date","2016-05-02"]}, 3, 0]
        },
        moreThanDate: {
            $cond: [ {$gt:["$bal.date","2015-08-02"]}, 4, 0]
        }  
    }
},
{
    $group: {
        _id: "$bal",
        countSmaller: { $sum: "$lessThanDate" },
        countBigger: { $sum: "$moreThanDate" }
    }
}
 ])

Запрос не выполняется должным образом.

Ожидаемый результат должен быть равен количеству массивов как1.

Пожалуйста, помогите мне с запросом, так как я новичок в mongodb.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Помимо нескольких изменений в вашем запросе, его можно решить, используя $ unwind для вложенного массива.

db.getCollection("temp").aggregate([
{ "$unwind": "$bal"},
{$match:{
    "_id.a" : "NA"
    }
},

{
$project: {
    "bal": 1, 
    lessThanDate: {
        $cond: [ {$lt:["$bal.date",ISODate("2016-05-02")]}, 1, 0]
    },
    moreThanDate: {
        $cond: [ {$gt:["$bal.date",ISODate("2015-08-02")]}, 1, 0]
    }
}
},
{
$group: {
    _id: "$bal.type",
    countSmaller: { $sum: "$lessThanDate" },
    countBigger: { $sum: "$moreThanDate" }
}
}
])

Я изменил следующие вещи: -

  1. Используя ISODate для дат вместо String (, вы можете использовать новую Date (), если вам нужно использовать String в качестве значения Date вместо ISODate () )
  2. Изменение условия совпадения с "_id_a ":" NA " до " _ id.a ":" NA "
  3. Группировка по типу bal.type как _id (при необходимости вы можете использовать другое поле)
  4. Использование $ unwind

Подробнее о $ unwind можно прочитать здесь

0 голосов
/ 27 марта 2019

$ facet может помочь здесь выбрать значения bal, основанные на различных наборах условий

var maxDate = '2016-05-02';
var minDate = '2015-08-02';

db.getCollection('bal').aggregate([
{ $match: { '_id.a': 'NA' }},
{ $facet: {
    'balancesBelowMax': [
        { $unwind: '$bal'},
        { $match: {'bal.date': {$lte: maxDate}}}
    ],
    'balancesAboveMax': [
        { $unwind: '$bal'},
        { $match: {'bal.date': {$gte: minDate}}}
    ],
}},
{ $project: { balancesBelowMax: {$size: '$balancesBelowMax'}, balancesAboveMax: {$size: '$balancesBelowMax'} }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...