1

我在电机中有这个查询:

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 中可以吗?我怎样才能做到这一点?

4

1 回答 1

0

如果您包含“stat”集合中的一些示例文档,我可以给出更可靠的答案。但是根据您提供的信息,我可以猜到。添加一个类似的阶段:

{'$group': {'_id': '$info.date', 'info': {'$first': '$info'}}}

这为您提供了结果列表中与前一个文档具有不同“日期”的每个文档。

也就是说,如果您只需要一个不同的日期列表,这会更简单更快:

db.stats.distinct("date_time")
于 2016-07-18T13:08:02.843 回答