MongoDB聚合与之前的文档进行比较

时间:2016-07-18 12:41:11

标签: python mongodb aggregation-framework tornado-motor

我在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中使用?我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

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

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

它为您提供了结果列表中具有独特"日期"的每个文档。来自上一份文件。

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

db.stats.distinct("date_time")