在流星中搜索日期范围

时间:2014-06-30 01:00:37

标签: mongodb meteor

我在Meteor中为一个项目做一个搜索系统,需要在两个日期之间进行搜索。但是,日期在MongoDB的数组中:

"relatorios" : [
    {
        "mes" : ISODate("2013-11-01T02:00:00Z"),
        "revistas" : "2",
        "brochuras" : "2",
        "livros" : "0",
        "folhetos" : "0",
        "revisitas" : "0",
        "estudos" : "0",
        "horas" : "12"
    },
    {
        "mes" : ISODate("2013-09-01T03:00:00Z"),
        "revistas" : "0",
        "brochuras" : "0",
        "livros" : "0",
        "folhetos" : "0",
        "revisitas" : "0",
        "estudos" : "0",
        "horas" : "12"
    }
]

我试图直接通过mongo查询过滤日期,但不能。我在一些论坛上读过有关在Meteor中使用MapReduce的内容。 什么是最好的选择?如果可能的话,我该怎么办?

3 个答案:

答案 0 :(得分:11)

您可以使用点表示法,例如a和b之间的两个日期

var start = new Date(450000);
var end = new Date(5450000000000);

CollectionName.find({ 'relatorios.mes' : { $gte : start, $lt: end });

因此,这将获得具有与此字段匹配的数组的所有文档。记住mongodb提取文档,所以如果你只有一个匹配的数组,它会给你整个文档。

答案 1 :(得分:0)

您可以使用$elemMatch查找在两个日期之间具有relatorios值的单个数组mes元素,并使用$位置投影运算符仅包含该匹配输出中的元素。

在shell中:

start = new Date('2013-11-01T01:30:00Z');
end = new Date('2013-11-01T02:30:00Z');
db.test.find(
    {relatorios: {$elemMatch: {mes: {$gt: start, $lt: end}}}}, 
    {'relatorios.$': 1})

如果您不使用$elemMatch,则可以将$gt与一个元素匹配,将$lt与另一个元素匹配。

或者,如果您需要在日期范围内(而不仅仅是第一个)获取所有 relatorios元素,则可以使用aggregate

db.test.aggregate([
    // Get all docs with at least one element in the date range
    {$match: {relatorios: {$elemMatch: {mes: {$gt: start, $lt: end}}}}}, 
    // Duplicate each doc, once per relatorios element.
    {$unwind: '$relatorios'}, 
    // Filter those to just the ones in the date range.
    {$match: {'relatorios.mes': {$gt: start, $lt: end}}}
])

答案 2 :(得分:0)

    let date = new Date();
    let getFirstDay = new Date(date.getFullYear(), date.getMonth() + 1, 1);
    let getLastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0);

    let firstDay = getFirstDay.getFullYear() + '-' + ((''+getFirstDay.getMonth()).length<2 ? '0' : '') + getFirstDay.getMonth() + '-' + ((''+getFirstDay.getDate()).length<2 ? '0' : '') + getFirstDay.getDate()+"T00:00:00.000Z";
    let lastDay = getLastDay.getFullYear() + '-' + ((''+getLastDay.getMonth()).length<2 ? '0' : '') + (getLastDay.getMonth()+1) + '-' + ((''+getLastDay.getDate()).length<2 ? '0' : '') + getLastDay.getDate()+"T00:00:00.000Z";

var pipeline = [
        { 
            $match: { headofficeId: headofficeId }},
            { $match: {'createdDate': {$gt: new Date(firstDay), $lt: new Date(lastDay)}}},
            {$group: {_id: "$branchId", total: {$sum: "$actualValue"}}},
            { $sort: { total: -1 } 
        }
    ];
var result = Commissions.aggregate(pipeline);
return result;