我有对象
var items = [
[{
id: 1
start: "2015-03-01 21:50:00",
end: "2015-03-01 21:51:00"
}],
[{
id: 2
start: "2015-03-01 21:50:06",
end: "2015-03-01 21:52:00"
}],
[{
id: 3
start: "2015-03-01 21:50:08",
end: "2015-03-01 21:51:40"
}],
[{
id: 4
start: "2015-03-01 21:50:16",
end: "2015-03-01 21:52:50"
}],
[{
id: 5
start: "2015-03-01 21:50:30",
end: "2015-03-01 21:54:50"
}],
[{
id: 6
start: "2015-03-02 21:50:59",
end: "2015-03-01 21:54:08"
}]
];
同样我缺少行,我必须计算在1分钟内有多少记录的开始时间和end_time参数。
如何使用javascript和mongodb实现此目的。
答案 0 :(得分:0)
您可能希望比较两个字段,获得开始和结束字段的分钟差异。你可以用两种方式做到这一点。
第一种方法是在$where
查询中使用find()
运算符。假设您的集合items
由这些文档组成:
db.items.insert([
{
_id: 1,
start: ISODate("2015-03-01 21:50:00"),
end: ISODate("2015-03-01 21:51:00")
},
{
_id: 2,
start: ISODate("2015-03-01 21:50:06"),
end: ISODate("2015-03-01 21:52:00")
},
{
_id: 3,
start: ISODate("2015-03-01 21:50:08"),
end: ISODate("2015-03-01 21:51:40")
},
{
_id: 4,
start: ISODate("2015-03-01 21:50:16"),
end: ISODate("2015-03-01 21:52:50")
},
{
_id: 5,
start: ISODate("2015-03-01 21:50:30"),
end: ISODate("2015-03-01 21:54:50")
},
{
_id: 6,
start: ISODate("2015-03-02 21:50:59"),
end: ISODate("2015-03-01 21:54:08")
}
])
使用$where
运算符来获取开始日期和结束日期之间持续一分钟的文档(假设这些日期是在同一天),查询:
db.items.find({"$where": "this.end.getMinutes() - this.start.getMinutes() == 1"});
returns
/* 0 */
{
"_id" : 1,
"start" : ISODate("2015-03-01T21:50:00.000Z"),
"end" : ISODate("2015-03-01T21:51:00.000Z")
}
/* 1 */
{
"_id" : 3,
"start" : ISODate("2015-03-01T21:50:08.000Z"),
"end" : ISODate("2015-03-01T21:51:40.000Z")
}
但是,使用$where
运算符时,有一些值得考虑的问题。来自文档:
$ where评估JavaScript并且无法利用索引。 因此,在表达查询时,查询性能会提高 使用标准的MongoDB运算符(例如,$ gt,$ in)。一般来说,你 只有当你不能用另一个表达你的查询时,才应该使用$ where 运营商。如果您必须使用$ where,请尝试至少包含一个 标准查询运算符,用于过滤结果集。单独使用$ 需要进行表扫描。
第二种方法是使用MongoDB的 aggregation framework 。您的管道通常如下:
db.items.aggregate([
{
"$group": {
"_id": {"_id": "$_id",
"start_year": { "$year": "$start" },
"start_month": { "$month": "$start" },
"start_day": { "$dayOfMonth": "$start" },
"start_hour": { "$hour": "$start" },
"start_minutes": { "$minute": "$start" },
"end_year": { "$year": "$end" },
"end_month": { "$month": "$end" },
"end_day": { "$dayOfMonth": "$end" },
"end_hour": { "$hour": "$end" },
"end_minutes": { "$minute": "$end" }},
"data": {
"$addToSet": "$$ROOT"
}
}
},
{
"$project": {
"isMinuteDuration": {
"$eq": [
{ "$subtract": [ "$_id.end_minutes", "$_id.start_minutes" ] },
1
]
},
"data": 1,
"_id": 0
}
},
{
"$match": {
"isMinuteDuration": true
}
},
{
"$unwind": "$data"
},
{
"$project": {
"_id": "$data._id",
"start": "$data.start",
"end": "$data.end"
}
}
])
<强>输出强>
/* 0 */
{
"result" : [
{
"_id" : 3,
"start" : ISODate("2015-03-01T21:50:08.000Z"),
"end" : ISODate("2015-03-01T21:51:40.000Z")
},
{
"_id" : 1,
"start" : ISODate("2015-03-01T21:50:00.000Z"),
"end" : ISODate("2015-03-01T21:51:00.000Z")
}
],
"ok" : 1
}