【发布时间】:2017-06-28 11:29:31
【问题描述】:
我正在尝试使用 mongodb 进行分析,但我对它很陌生,虽然我让它适用于 1 个查询,但我认为它的效率不高,这是我的数据集示例
{
_id: ObjectId("54442882fa2e117a55f3458b"),
analytic_num: 185,
createdAt: ISODate("2014-10-19T21:09:22.167Z"),
updatedAt: ISODate("2014-10-19T21:09:22.167Z"),
rawBrowser: "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:33.0) Gecko/20100101 Firefox/33.0",
gender: "male",
eventId: "accepted",
type: "member",
relationshipStatus: "Single",
ageRange: "18-25",
uid: "53f79ae6f158168161f04d27",
cid: "54370fa7498a776e1c065120",
education: ["high_school", "professional_degree"],
interestedIn: ["female"],
__v: 0
}
这是我正在尝试的查询
db.analytics.aggregate([{
$match: {
createdAt: {
$gte: new Date(2014, 9, 15),
$lt: new Date(2014, 9, 28)
}
}
}, {
$project: {
_id: 0,
minute: {
$minute: "$createdAt"
},
hour: {
$hour: "$createdAt"
}
}
}, {
$group: {
_id: {
minute: "$minute",
hour: "$hour"
},
hits: {
$sum: 1
}
}
}]);
这是我得到的结果
{ "_id" : { "minute" : 33, "hour" : 21 }, "hits" : 1 }
{ "_id" : { "minute" : 29, "hour" : 21 }, "hits" : 6 }
{ "_id" : { "minute" : 6, "hour" : 22 }, "hits" : 2 }
{ "_id" : { "minute" : 9, "hour" : 21 }, "hits" : 1 }
一切都很好,但我每小时的每一分钟都得到点击,如果我只想点击,那很好
但如果我需要按类型、性别或年龄范围查找命中,我需要更改 $match 查询,通过更改 $matvh 对所有属性运行此查询效率不高
如何在一个查询中获取类型、性别、angRange 的所有匹配项 我想要这样的结果
{ "_id" : { "minute" : 33, "hour" : 21 }, "hits" : 30, "member" :2 "single": 12 ,"male" :12 }
{ "_id" : { "minute" : 34, "hour" : 21 }, "hits" : 50, "member" :22 "single": 12 ,"male" :12 }
请帮忙
谢谢
【问题讨论】:
-
我认为聚合不能在一个查询中得到结果。例如字段gender的值可以是男也可以是女;分别求和,您必须通过将每个指定为组 id 的一部分来对它们进行分组。因此,您最后必须将这些字段一一分组。使用mapReduce应该可以通过
one query得到结果。 -
@Wizard 你完全不正确。我想建议您暂时不要在这里尝试回答人们,并花一些时间观察和学习。太多的误导性陈述来自您对该主题的缺乏了解。这对人们没有帮助。
标签: javascript node.js mongodb mongodb-query aggregation-framework