我在Motor中有这个查询:
history = yield self.db.stat.aggregate([
{'$match': {'user_id': user.get('uid')}},
{'$sort': {'date_time': -1}},
{'$project': {'user_id': 1, 'cat_id': 1, 'doc_id': 1, 'date_time': 1}},
{'$group': {
'_id': '$user_id',
'info': {'$push': {'doc': '$doc_id', 'date': '$date_time', 'cat': '$cat_id'}},
'total': {'$sum': 1}
}},
{'$unwind': '$info'},
])
stat
集合中的文档如下所示:
{
"_id" : ObjectId("5788fa45bc54f428d8e77903"),
"vrr_id" : 2,
"date_time" : ISODate("2016-07-15T14:59:17.411Z"),
"ip" : "10.79.0.230",
"cat_id" : "rsl01",
"vrr_group" : ObjectId("55f6d1b5aaab934a00bae1a4"),
"col" : [
"dledu"
],
"vrr_type" : "TH",
"doc_type" : "local",
"user_id" : "696230",
"page" : null,
"method" : "OpenView",
"branch" : 9,
"sc" : 200,
"doc_id" : "004894802",
"spec" : 0
}
/* 40 */
{
"_id" : ObjectId("5788fa45bc54f428d8e77904"),
"vrr_id" : 2,
"date_time" : ISODate("2016-07-15T14:59:17.500Z"),
"ip" : "10.79.0.230",
"cat_id" : "rsl01",
"vrr_group" : ObjectId("55f6d1b5aaab934a00bae1a4"),
"col" : [
"autoref"
],
"vrr_type" : "TH",
"doc_type" : "open",
"user_id" : "696230",
"page" : null,
"method" : "OpenView",
"branch" : 9,
"sc" : 200,
"doc_id" : "000000002",
"spec" : "07"
}
我想将date_time
字段与之前文档中的date_time
进行比较,如果它们不相等(或者不在5秒内的timedelta中),请将其包含在结果中。
在Python中过滤这个很容易,是否可以在Mongo中使用?我怎样才能做到这一点?
答案 0 :(得分:0)
如果您包含来自" stat"的一些示例文档。我可以给出一个更可靠的答案。但是根据您提供的信息,我猜可以。添加一个类似的阶段:
{'$group': {'_id': '$info.date', 'info': {'$first': '$info'}}}
它为您提供了结果列表中具有独特"日期"的每个文档。来自上一份文件。
也就是说,如果你需要的只是一个独特的日期列表,这会更简单,更快:
db.stats.distinct("date_time")