Mongodb 通过条件查找优化Mongo聚合查询
因此,我有一个集合事件,如下所示:Mongodb 通过条件查找优化Mongo聚合查询,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,因此,我有一个集合事件,如下所示: db.events.aggregate([ { "$facet": { "comments": [ {"$match": {"category": "Comment"}}, {"$match": {"deleted_reference_field": "Not Deleted"}}, { "$lookup": {
db.events.aggregate([
{
"$facet": {
"comments": [
{"$match": {"category": "Comment"}},
{"$match": {"deleted_reference_field": "Not Deleted"}},
{
"$lookup": {
"from": "comment",
"localField": "reference_field",
"foreignField": "_id",
"as": "Comments",
}
},
{"$unwind": "$Comments"},
{"$match": {"Comments.project_id": bson.ObjectId(project_id)}},
],
"deleted_comments": [
{"$match": {"category": "Comment"}},
{"$match": {"deleted_reference_field": "Project"}},
{"$match": {"reference_field": bson.ObjectId(project_id)}},
]}
}
])
事件
{
"_id" : ObjectId("5c8f4d3bbbf999bd7d1cc11c"),
"category" : "Comment",
"reference_field" : ObjectId("5c8f4ba4bbf999bbb056984f"), // Object id of a document in the COMMENT collection
"deleted_reference_field" : "Not Deleted",
"summary" : "Some string"
},
{
"_id" : ObjectId("5c8b7e6dbbf99995bdcb37ac"),
"category" : "Comment",
"reference_field" : ObjectId("5c8b3fe9bbf9997e1f18c816"), // object id of a document in the PROJECT collection
"deleted_reference_field" : "Project",
"summary" : "Here is a new comment!"
}
如您所见,事件
集合的两个文档都引用了不同的集合。这由deleted\u reference\u字段
属性确定
- 如果未删除其值,则
包含引用reference_字段
集合的objectId注释
- 如果值是
或任何此类字符串,则Project
包含它应该引用的集合的对象id。在本例中,它指的是reference\u字段
集合项目
$lookup
以填充相应的参考\ u字段
。为了做到这一点,我需要某种if-else
语句,以便指定要查看的集合
我的聚合管道应该做什么的伪代码:
按类别对所有文档进行分组
如果引用字段为“未删除”
然后对类别中提到的集合进行$lookup
else$查找已删除的\u引用\u字段集合(本例中为Project)
当前聚合代码:
我目前的管道根本没有效率。我正在浏览N个文档,每次我都有一个不同的类别和不同的deleted\u reference\u字段值。看起来是这样的:
db.events.aggregate([
{
"$facet": {
"comments": [
{"$match": {"category": "Comment"}},
{"$match": {"deleted_reference_field": "Not Deleted"}},
{
"$lookup": {
"from": "comment",
"localField": "reference_field",
"foreignField": "_id",
"as": "Comments",
}
},
{"$unwind": "$Comments"},
{"$match": {"Comments.project_id": bson.ObjectId(project_id)}},
],
"deleted_comments": [
{"$match": {"category": "Comment"}},
{"$match": {"deleted_reference_field": "Project"}},
{"$match": {"reference_field": bson.ObjectId(project_id)}},
]}
}
])
如您所见,有两个“bucket”,一个用于评论,另一个用于删除的内容。因此,每次我创建一个bucket时,我都会检查所有文档,以筛选出类别为“Comment”和deleted\u reference\u field
的文档,这些文档的类别为“Not deleted”或“Project”。大约有7-8个类别(我只展示了注释),我遵循了相同的流程,因此证明效率非常低
因此,我希望通过根据类别对所有文档进行分组,并根据已删除的\u引用\u字段中的值对它们进行进一步分组,来降低这种巨大的复杂性
简言之:
如何构建一个聚合管道,该管道可以执行条件查找,因为文档完全是从不同的集合中获取的