要求:我想要did not perform the "View" event in last 5 hours
的所有客户的集合。
数据:
{
name: "Sheldon",
events: [
{
event: "View",
timestamp: "timestamp equivalent to 10 hours ago"
},
{
event: "Some other event",
timestamp: "timestamp equivalent to 8 hours ago"
},
{
event: "View",
timestamp: "timestamp equivalent to 2 hours ago"
}
]
},
{
name: "Leonard",
events: [
{
event: "View",
timestamp: "timestamp equivalent to 10 hours ago"
}
]
},
{
name: "Howard",
events: [
{
event: "View",
timestamp: "timestamp equivalent to 2 hours ago"
}
]
},
{
name: "Raj",
events: [
{
event: "Some other event",
timestamp: "timestamp equivalent to 6 hours ago"
}
]
}
我已经尝试了以下方法,但是它总是返回
"Sheldon"
(可能是因为另一个事件最终满足了条件?)。q.where({
$and: [
{
'events': {
$not: {
$elemMatch: {
event: "View",
timestamp: {
$gte: "timestamp equivalent to 5 hours ago"
}
}
}
}
}
]
});
我该怎么做,以便仅返回
"Leonard"
和"Raj"
的文档? 最佳答案
获取用户最近5个小时的访问量。你可以尝试一下
db.collectionName.find({
events: {
$not: {
$elemMatch: {
event: "View",
timestamp: {
$gt: ISODate("2017-03-29T05:12:37.420Z") // equivalent to 5 hours ago
}
}
}
}
}, {name: 1})
此查询
returned
仅显示给定示例的Leonard
和Raj
文档N.B:与您的查询类似,但我使用
find
代替where
,无需使用$and
并使用$gt
代替$gte
已测试文档。
{
"_id" : ObjectId("58db886e4b9e731aaefa9820"),
"name" : "Sheldon",
"events" : [
{
"event" : "View",
"timestamp" : ISODate("2017-03-29T00:09:18.723Z")
},
{
"event" : "Some other event",
"timestamp" : ISODate("2017-03-29T02:10:04.492Z")
},
{
"event" : "View",
"timestamp" : ISODate("2017-03-29T08:11:02.196Z")
}
]
}
{
"_id" : ObjectId("58db886e4b9e731aaefa9821"),
"name" : "Leonard",
"events" : [
{
"event" : "View",
"timestamp" : ISODate("2017-03-29T00:11:23.084Z")
}
]
}
{
"_id" : ObjectId("58db886e4b9e731aaefa9822"),
"name" : "Howard",
"events" : [
{
"event" : "View",
"timestamp" : ISODate("2017-03-29T08:11:02.196Z")
}
]
}
{
"_id" : ObjectId("58db886e4b9e731aaefa9823"),
"name" : "Raj",
"events" : [
{
"event" : "Some other event",
"timestamp" : ISODate("2017-03-29T04:10:42.972Z")
}
]
}
应用查询结果后:
{
"_id" : ObjectId("58db886e4b9e731aaefa9821"),
"name" : "Leonard"
},
{
"_id" : ObjectId("58db886e4b9e731aaefa9823"),
"name" : "Raj"
}