Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 通过条件查找优化Mongo聚合查询_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

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
    或任何此类字符串,则
    reference\u字段
    包含它应该引用的集合的对象id。在本例中,它指的是
    项目
    集合

我需要执行
$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字段中的值对它们进行进一步分组,来降低这种巨大的复杂性

简言之:

如何构建一个聚合管道,该管道可以执行条件查找,因为文档完全是从不同的集合中获取的