我在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的内容。 什么是最好的选择?如果可能的话,我该怎么办?
答案 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;