Javascript 多值mongodb聚合
我正在尝试使用mongodb进行分析,但我对它非常陌生,尽管我让它为一个查询工作,但我认为它不是有效的,下面是我的数据集示例Javascript 多值mongodb聚合,javascript,node.js,mongodb,mongodb-query,aggregation-framework,Javascript,Node.js,Mongodb,Mongodb Query,Aggregation Framework,我正在尝试使用mongodb进行分析,但我对它非常陌生,尽管我让它为一个查询工作,但我认为它不是有效的,下面是我的数据集示例 { _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 (X
{
_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
如何在一个查询中获得类型、性别和范围的所有命中率
我想要这样的结果
{ "_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 }
请帮忙
谢谢您正在寻找接线员。这允许您评估一个条件,然后决定该条件是否返回要返回的值。在这种情况下,无论是要向操作添加增量还是不添加增量:
db.analytics.aggregate([
{“$match”:{
“创建数据”:{
“$gte”:新日期(2014年9月15日),
“$lt”:新日期(2014年9月28日)
}
}},
{“$组”:{
“_id”:{
“分钟”:{“$minute”:“$createdAt”},
“小时”:{“$hour”:“$createdAt”}
},
“hits”:{“$sum”:1},
“成员”:{
“$sum”:{
“$cond”:[
{“$eq”:[“$type”,“member”]},
1.
0
]
}
},
“单身”:{
“$sum”:{
“$cond”:[
{“$eq”:[“$relationshipStatus”,“single”]},
1.
0
]
}
},
“男性”:{
“$sum”:{
“$cond”:[
{“$eq”:[“$gender”,“male”]},
1.
0
]
}
}
}}
]);
因此,$cond
运算符基本上是一个“三元”或if..then..else
构造,它计算一个条件并根据该条件的确定方式返回一个值,true | false
。以这种方式使用它来确定返回的值
小心使用日期聚合运算符。也许你想要的是每一小时的每一分钟,在这个范围内的所有天的总和。但通常人们只想要每天的离散时间段,甚至是每分钟
小心你的要求,你可能会得到它。我不认为一次查询就可以得到结果。例如,字段性别的值可以是男性或女性;要分别求和,必须通过将每个字段指定为组id的一部分来对它们进行分组。因此,最后必须逐个对这些字段进行分组。使用mapReduce应该能够通过
一次查询
@向导获得结果。您完全不正确。我想建议你暂时停止回答这里的人,花点时间观察和学习。太多的误导性陈述来自于你对这个问题的缺乏知识。这对人们没有帮助。嘿@Neil我有语法错误:意外数字你能找出它的位置吗?$cond中缺少一个分号嘿@Neil我在评估你的答案似乎正是我想要的,如果我有一个数组,我只想问一件事,例如教育:[“高中”,“专业学位”],如何选择个人点击,如高中、专业学位,因为我不能使用$eq运算符可能我应该使用$in运算符,但我得到错误“异常:无效运算符'$in',如果我不能使用数组,你有其他建议如何解决此问题,谢谢