我有两个集合"数据集"和"用户".我try 在两个集合中查找对象array.

我想要连接"datets.stateHistory.date"字段和"users.prices.date"字段.获取DataSets集合的结果我需要"users.prices.Price"总和值的总和

Datasets json Data:

"datasets": [
    {
      "colorDescription": "braun, rose gold",
      "stateHistory": [
        {
          "state": "scanning",
          "date": "2022-02-22T13:06:13.493+00:00"
        },
        {
          "state": "scanned",
          "date": "2022-02-18T13:06:13.493+00:00"
        },
        {
          "state": "reconstructing",
          "date": "2022-02-16T13:06:13.493+00:00"
        }
      ]
    },
    {
      "colorDescription": "beige, silber",
      "stateHistory": [
        {
          "state": "scanning",
          "date": "2022-03-22T13:06:13.493+00:00"
        },
        {
          "state": "scanned",
          "date": "2022-03-18T13:06:13.493+00:00"
        },
        {
          "state": "reconstructing",
          "date": "2022-03-16T13:06:13.493+00:00"
        }
      ]
    }
  ]

Users json Data:

"users": [
    {
      "name": "Aravinth",
      "prices": [
        {
          "date": "2022-02-16T13:06:13.493+00:00",
          "price": 45
        },
        {
          "date": "2022-03-22T13:06:13.493+00:00",
          "price": 55
        }
      ]
    },
    {
      "name": "Raja",
      "prices": [
        {
          "date": "2022-02-24T13:06:13.493+00:00",
          "price": 75
        },
        {
          "date": "2022-03-23T13:06:13.493+00:00",
          "price": 85
        }
      ]
    }
  ]

Expected result json Data:

[
    {
      "colorDescription": "braun, rose gold",
      "cgPrices: 45,
      "stateHistory": [
        {
          "state": "scanning",
          "date": "2022-02-22T13:06:13.493+00:00"
        },
        {
          "state": "scanned",
          "date": "2022-02-18T13:06:13.493+00:00"
        },
        {
          "state": "reconstructing",
          "date": "2022-02-16T13:06:13.493+00:00"
        }
      ]
    },
    {
      "colorDescription": "beige, silber",
      "cgPrices: 0,
      "stateHistory": [
        {
          "state": "scanning",
          "date": "2022-03-22T13:06:13.493+00:00"
        },
        {
          "state": "scanned",
          "date": "2022-03-18T13:06:13.493+00:00"
        },
        {
          "state": "reconstructing",
          "date": "2022-03-16T13:06:13.493+00:00"
        }
      ]
    }
  ]

"cgPrice"字段我需要与添加两个集合的日期匹配的价格总和.

我的代码是:

db.datasets.aggregate([
  {
    "$lookup": {
      "from": "users",
      "as": "details",
      "localField": "stateHistory.date",
      "foreignField": "prices.date"
    }
  },
  {
    "$project": {
      color: "$details.colorDescription",
      prices: "$details"
    }
  }
])

如何加入查找并获得匹配字段的价格添加额外的字段"cgPrice"count sum.

Mongoplayground 链接:https://mongoplayground.net/p/vv8R3DlEDYo

推荐答案

您只需要进行大量的重构,下面是一个使用$map$filter$reduce运算符的示例:

db.datasets.aggregate([
  {
    "$lookup": {
      "from": "users",
      "as": "details",
      "localField": "stateHistory.date",
      "foreignField": "prices.date"
    }
  },
  {
    "$project": {
      colorDescription: 1,
      stateHistory: 1,
      prices: {
        $sum: {
          $map: {
            input: {
              $filter: {
                input: {
                  $reduce: {
                    input: {
                      $map: {
                        input: "$details",
                        in: "$$this.prices"
                      }
                    },
                    initialValue: [],
                    in: {
                      "$concatArrays": [
                        "$$this",
                        "$$value"
                      ]
                    }
                  }
                },
                cond: {
                  $in: [
                    "$$this.date",
                    "$stateHistory.date"
                  ]
                }
              }
            },
            in: "$$this.price"
          }
        }
      }
    }
  }
])

Mongo Playground

Mongodb相关问答推荐

如何根据两个 struct 创建一个Mongo文档?

数组字段包含其他字段的数组值

MongoDB 聚合 $match 阶段与条件查询

随着时间的推移在 mongodb 中获得

如何使用指南针连接到 mongodb replicaset (k8s)

NodeJS + MongoDB:使用 findOne () 从集合中获取数据

实现 twitter 和 facebook 之类的主题标签

mongo _id 字段重复键错误

如何使用 Spring Data MongoDB 通过 GridFS ObjectId 获取二进制流

Mongoid 有 Map/Reduce 吗?

如何根据其他字段添加条件模式?

具有简单密码认证的 MongoDB 副本集

Mongo按实际上是数字的字符串值排序

MongoDB限制内存

使用 Jackson 与 Java Mongo DBObject 进行高效 POJO 映射

没有参考选项的mongoose填充字段

我们如何使用spring boot为mongodb创建自动生成的字段

使用 mongoengine 将多文档插入到 mongodb

brew install mongodb 错误:Cowardly refusing to `sudo brew install' Mac OSX Lion

与 mongoose/node.js 共享数据库连接参数的最佳方式