如何在mongo中使用aggregate和$ unwind后重新组合列表?

时间:2016-04-05 12:55:15

标签: python mongodb pymongo

我按如下方式构建聚合管道

pipeline = [ 
        {"$unwind": "$categories"}
    ]
if len(cat_comp) > 0:
        pipeline.append({"$match": {"categories": {"$in": cat_comp}}})

result = mongo.db.xxx.aggregate(pipeline)['result']

问题是,如何执行聚合可以在结果中重新组合类别列表,因为返回的每个记录都是类别字段对应于列表中的一个项目。如何重建结果,以便我可以对可能列表执行匹配($match),但恢复原始类别列表。

有人建议我尝试:

pipeline.append({"$group": {"categories": {"$push": "$categories"}}})

我已将其修改为:

pipeline.append({"$group": {"_id": "anything", "categories": {"$push": "$categories"}}})

但是现在,我只收到一条记录,其中包含所有结果中的大量列表。所以我想做的就是拿一份文件:

{
"_id": 45666
"categories": ['Fiction', 'Biography']
"other": "sss"
}

并通过正则表达式从用户列表category_list = ['Anything', ...]进行搜索:

cat_comp = [re.compile(cat, re.IGNORECASE) for cat in cat_list]

最后,聚合(管道)发生的事情是我正在失去"类别"作为列表,因为$unwind。现在,我如何对输入数据执行查询,但返回与我将类别作为列表匹配的记录。

我也在尝试:

pipeline.append({"$group": {"_id": "$_id", "categories": { "$addToSet": "$categories" } } })

有用地返回列表中包含类别的记录列表 - 但是,如何查看记录的其余部分,我只能看到_idcategories

1 个答案:

答案 0 :(得分:1)

您需要在管道中使用$group步骤$push来重新构建列表:

pipeline.append({"$group": {"categories": {"$push": "$categories"},"_id":"$_id","other": {"$first":"$other"}}})