我的文档 struct 如下所示:

[
    {
        "country": "UK",
        "shops": [
            {"city": "London", "fruits": ["banana", "apple"]},
            {"city": "Birmingham", "fruits": ["banana", "pineapple"]},
        ],
    },
    {
        "country": "DE",
        "shops": [
            {"city": "Munich", "fruits": ["banana", "strawberry"]},
            {"city": "Berlin", "fruits": ["kiwi", "pineapple"]},
        ],
    },
]

在我的python脚本中,我有一个将每个水果映射到一个类别值的dict:

categories = {
    1: ["apple"],
    2: ["banana", "kiwi"],
    3: ["pineapple", "strawberry"]
}

DESIRED OUTPUT:

现在,我想使用mongo聚合框架 for each 文档获取基于类别映射的店铺子文档中找到的最大值所映射的max_ategory.

[
    {
        "country": "UK",
        "shops": [
            {"city": "London", "fruits": ["banana", "apple"]},
            {"city": "Birmingham", "fruits": ["banana", "pineapple"]},
        ],
        "max_category": 3
    },
    {
        "country": "DE",
        "shops": [
            {"city": "Munich", "fruits": ["banana", "apple"]},
            {"city": "Berlin", "fruits": ["kiwi", "apple"]},
        ],
        "max_category": 2
    },
]

谢谢你的帮忙!

推荐答案

你的分类dict不适合mongo,因为mongo要求对象有字符串类型的键.为了更容易处理,您可以将词典整理为以下表格:

[
  {
    category: 1,
    fruits: [
      "apple"
    ]
  },
  {
    category: 2,
    fruits: [
      "banana",
      "kiwi"
    ]
  },
  {
    category: 3,
    fruits: [
      "pineapple",
      "strawberry"
    ]
  }
]

在聚合管道中,按$reduce迭代带参数的类别数组以有条件地更新累加器,以获得最大匹配类别.

db.collection.aggregate([
  {
    "$unwind": "$shops"
  },
  {
    "$set": {
      "max_category": {
        "$reduce": {
          "input": [
            {
              category: 1,
              fruits: [
                "apple"
              ]
            },
            {
              category: 2,
              fruits: [
                "banana",
                "kiwi"
              ]
            },
            {
              category: 3,
              fruits: [
                "pineapple",
                "strawberry"
              ]
            }
          ],
          "initialValue": null,
          "in": {
            "$cond": {
              "if": {
                $and: [
                  {
                    $gt: [
                      "$$this.category",
                      "$$value"
                    ]
                  },
                  {
                    $gt: [
                      {
                        $size: {
                          "$setIntersection": [
                            "$$this.fruits",
                            "$shops.fruits"
                          ]
                        }
                      },
                      0
                    ]
                  }
                ]
              },
              "then": "$$this.category",
              "else": "$$value"
            }
          }
        }
      }
    }
  },
  {
    "$group": {
      "_id": "$_id",
      "country": {
        $first: "$country"
      },
      "max_category": {
        $max: "$max_category"
      },
      "shops": {
        "$push": "$shops"
      }
    }
  }
])

Mongo Playground

Mongodb相关问答推荐

MongoDB聚合匹配字符串字符

try 从数据库创建、获取数据时失败(pymongo、MongoDB、docker-compose)

MongoDB:检测所有重叠事件(开始/结束日期)?

如何通过 Go 以 UUID 类型保存 Mongo 中的内容?

分组前的 MongoDb 聚合总数

Mongodb,在一个查询中用正则表达式更新部分字符串

有没有办法从另一条记录中插入一条记录

在我的查询中使用 populate() 时的 MongoDB createIndex()

mongoDB 过滤、排序和排名结果

MongoDB:使用数组过滤器进行更新插入

为什么一个 mongodb 副本集需要奇数个投票 node ?

是否可以迭代 mongo 游标两次?

使用 ObjectId.GenerateNewId() 还是离开 MongoDB 创建一个?

Mongo:统计一组文档中单词出现的次数

启动mongodb和express的正确方法?

使用 mongoimport 将日期(ISODate)导入 MongoDB

如何对连接到 mongo 的方法进行单元测试,而不实际连接到 mongo?

Mongoimport json 文件更新或覆盖..?

MongoDB 中的多个 $inc 更新

MongoDb - 利用多 CPU 服务器进行写入繁重的应用程序