MongoDB,PyMongo如何通过uniques字段的计数过滤结果?

2024-05-14 01:25:25 发布

您现在位置:Python中文网/ 问答频道 /正文

MongoDb包含下一组数据

[{"user": "a", "domain": "some.com"},
{"user": "b", "domain": "some.com"},
{"user": "b1", "domain": "some.com"},
{"user": "c", "domain": "test.com"},
{"user": "d", "domain": "work.com"},
{"user": "aaa", "domain": "work.com"},
{"user": "some user", "domain": "work.com"} ] 

我需要选择按域筛选的第一个项目,结果中不超过2个相同的域。 mongo之后的查询结果应该如下所示

[{"user": "a", "domain": "some.com"},
{"user": "b", "domain": "some.com"},
{"user": "c", "domain": "test.com"},
{"user": "d", "domain": "work.com"},
{"user": "aaa", "domain": "work.com"}]

只有两个结果具有相同的域,必须跳过其他具有相同域的结果。这是否可能与$aggregation、$filter或其他内容有关

这是一种按域分组并仅获取前N个(示例中为2个)用户数据的方法吗?例如:

[{"domain": "some.com", "users": [a, b]}]

所以

{"user": "b1", "domain": "some.com"} will be skip

Tags: 数据项目testcomdomainmongomongodbsome
1条回答
网友
1楼 · 发布于 2024-05-14 01:25:25

执行MongoDB聚合可能会得到所需的结果

它包括四个阶段:
1.我们按domain字段分组,并累积到具有相同域名的data文档中
2.然后,我们将拼接阵列设置为每个域最多2个项目
3.我们使用$unwind操作符展平data字段
4.我们使用$replaceRoot运算符返回原始文档结构

db.collection.aggregate([
  {
    "$group": {
      "_id": "$domain",
      "data": { "$push": "$$ROOT" }
    }
  },
  {
    "$addFields": {
     "data": {
        "$slice": [ "$data", 0, 2 ]
      }
    }
  },
  {
    "$unwind": "$data"
  },
  {
    $replaceRoot: { "newRoot": "$data" }
  }
])

MongoPlaygroundPymongo Aggregation

相关问题 更多 >