我按如下方式构建聚合管道
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" } } })
有用地返回列表中包含类别的记录列表 - 但是,如何查看记录的其余部分,我只能看到_id
和categories
。