从 PyMongo 获取不同的模式匹配结果(子字符串)

Get distinct pattern match results (substrings) from PyMongo

查询 MongoDB 集合中给定字段中 unique/distinct 个子字符串的最有效方法是什么?

示例文档:

{"_id": "1234.abc.test1", "some_key": "some_value"}
{"_id": "1234.abc.test2", "some_key": "some_value"}
{"_id": "0420.def.test3", "some_key": "some_value"}

以上文档 ID 遵循内部命名空间约定。我需要知道该命名空间的所有不同的第一个元素是什么。

上述集合的查询所需输出:

1234
0420

我试图避免让整个数据集返回只是为了在之后的每一行上做 row['_id'].split('.')[0]。理想情况下,查询应该 return 只有那些子字符串的不同列表。

思路其实和你的一样(即按.拆分得到第一个元素),然后$group得到不同的记录

db.collection.aggregate([
  {
    $project: {
      first: {
        "$arrayElemAt": [
          {
            "$split": [
              "$_id",
              "."
            ]
          },
          0
        ]
      }
    }
  },
  {
    "$group": {
      "_id": "$first"
    }
  }
])

这里是Mongo playground供您参考。

这是上述查询的 PyMongo 实现:

pipeline = [
    {"$project": {"first": {"$arrayElemAt": [{"$split": ["$_id", "."]}, 0]}}},
    {"$group": {"_id": "$first"}}
]
result = self.collection.aggregate(pipeline=pipeline, allowDiskUse=False)