简体   繁体   English

PyMongo 按字段获取给定查询的分析

[英]PyMongo get analytics by field for given query

I have documents in mongo db, like我在 mongo db 中有文档,例如

doc = {
    name = MyName,
    tags = tag1,tag2,tag3,
    ...
}

When I search documents by name, I also want to get analytics of tags, for docs with that name, like当我按名称搜索文档时,我还想获得标签分析,对于具有该名称的文档,例如

{
   tag1: 7,
   tag2: 5,
   ...
   tagn: 14
}

How can I aggregate it?我怎样才能聚合它?

The data model complicates the query somewhat and the required output format complicates it even more... but here's one way to do it.数据 model 使查询有些复杂,所需的 output 格式使查询更加复杂......但这是一种方法。

db.collection.aggregate([
  {
    "$set": {
      "tags": {
        "$split": ["$tags", ","]
      }
    }
  },
  {"$unwind": "$tags"},
  {
    "$set": {
      "tags": {
        "$trim": {"input": "$tags"}
      }
    }
  },
  {
    "$group": {
      "_id": "$tags",
      "count": {"$count": {}}
    }
  },
  {
    "$sort": {"_id": 1}
  },
  {
    "$group": {
      "_id": null,
      "newRoot": {
        "$mergeObjects": {
          "$arrayToObject": [
            [
              {
                "$reduce": {
                  "input": {"$objectToArray": "$$ROOT"},
                  "initialValue": {},
                  "in": {
                    "$mergeObjects": [
                      "$$value",
                      {
                        "$switch": {
                          "branches": [
                            {
                              "case": {"$eq": ["$$this.k", "_id"]},
                              "then": {"k": "$$this.v"}
                            },
                            {
                              "case": {"$eq": ["$$this.k", "count"]},
                              "then": {"v": "$$this.v"}
                            }
                          ],
                          "default": "$$value"
                        }
                      }
                    ]
                  }
                }
              }
            ]
          ]
        }
      }
    }
  },
  {"$replaceWith": "$newRoot"}
])

Example output:示例 output:

[
  {
    "tag1": 2,
    "tag2": 2,
    "tag3": 3,
    "tag5": 1,
    "tag7": 1
  }
]

Try it on mongoplayground.net .mongoplayground.net上试试。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM