MongoDB聚合日期查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB聚合日期查询相关的知识,希望对你有一定的参考价值。

有人可以帮助我查询按日期> 2015-08-02和日期<2016-05-02得到bal数的计数吗?

我的收藏:

{
"_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" }
    }
}
 ])

查询未按预期运行。

预期结果应为bal数组计数为1。

因为我是mongodb的新手,请帮我查询一下。提前致谢。

答案

$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'} }}
])
另一答案

除了查询中的一些更改之外,可以使用嵌套数组上的$ 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(如果必须使用String作为Date值而不是ISODate(),则可以使用new Date())
  2. 将匹配条件从“_id_a”:“NA”更改为“_id.a”:“NA”
  3. 将bal.type分组为_id(您可以根据需要使用其他字段)
  4. 使用$ unwind

你可以阅读更多关于$ unwind here的信息

以上是关于MongoDB聚合日期查询的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB Mongoose 聚合查询深度嵌套数组删除空结果并填充引用

使用 Spring 数据和 mongoDB 进行日期排序的聚合

在 MongoDB 中按年和月聚合查询

在 mongodb 本地时区聚合

具有特定条件计数的 Mongodb 聚合并按输出投影的日期范围过滤不能按预期工作

mongodb 聚合 - 具有最后一个日期的组