当前位置: 首页 > 知识库问答 >
问题:

将$facet结果与子文档合并,然后有条件地排除文档

叶淇
2023-03-14

假设在$facet阶段之后,我得到了一个包含两个数组的结果:roomInfo和hotelInfo。

看起来是这样的:

{
  "roomInfo": [
    {
      _id: 'ab1',
      booked: 3
    },
    {
      _id: 'ab2',
      booked: 1
    }
  ],
  "hotelInfo": [
    {
      name: 'Radison Blue',
      roomDetails: [
        {
          _id: 'ab1',
          roomCount: 5
        },
        {
          _id: 'xy1',
          roomCount: 5
        }
      ]
    },
    {
      name: 'Intercontinental',
      roomDetails: [
        {
          _id: 'ab2',
          roomCount: 5
        }
      ]
    }
  ]
};

预期结果

我想要这样的输出:

[
  {
    name: 'Radison Blue',
    roomDetails: [
      {
        _id: 'ab1',
        roomCount: 5,
        booked: 3
      },
      {
        _id: 'xy1',
        roomCount: 5,
        booked: 0
      }
    ]
  },
  {
    name: 'Intercontinental',
    roomDetails: [
      {
        _id: 'ab2',
        roomCount: 5,
        booked: 1
      }
    ]
  }
];

基本上,在匹配roomInfo的ID后,将roomInfo中的预订属性添加到hotelInfo的roomDetails字段中。

如何实现这些用例?

谢谢

共有1个答案

皇甫繁
2023-03-14

基本上,该方法将迭代酒店并相应地匹配每个房间,下面是一个快速工作代码示例:

db.collection.aggregate([
  {
    $unwind: "$hotelInfo"
  },
  {
    $project: {
      name: "$hotelInfo.name",
      "roomDetails": {
        $filter: {
          input: {
            $map: {
              input: "$hotelInfo.roomDetails",
              as: "info",
              in: {
                "$mergeObjects": [
                  "$$info",
                  {
                    "$arrayElemAt": [
                      {
                        $filter: {
                          input: "$roomInfo",
                          as: "room",
                          cond: {
                            $eq: [
                              "$$room._id",
                              "$$info._id"
                            ]
                          }
                        }
                      },
                      0
                    ]
                  }
                ]
              }
            }
          },
          as: "proccessedInfo",
          cond: {
            $ne: [
              "$$proccessedInfo.roomCount",
              "$$proccessedInfo.booked"
            ]
          }
        }
      }
    }
  }
])

蒙哥游乐场

话虽如此,你提到你想在将来打电话。当前的方法似乎不可伸缩,因为这些是“真实数据点”,也就是酒店。如果您的规模有一定的限制(不超过数千家酒店),那就好了。但如果不是这样,我建议你问另一个关于整个管道的问题,这样我们可以调整它以更好地工作。

 类似资料:
  • 我需要结合两个反应性出版商的结果——Mono和Flux。我尝试使用和函数来实现这一点,但我无法满足两个特定条件: 结果包含的元素应与通量发射的元素一样多,但相应的Mono源只应调用一次(仅此条件可通过实现) 当通量为空时,链应在不等待单一元素的情况下完成 第一个条件的解决方案出现在结合单声道和通量条目中(粘贴在下面)。但是我无法在不阻塞链的情况下实现第二个条件——这是我想避免的。

  • 是否有tar命令来排除子目录,但包括文件夹根目录中的每个文件,然后将它们放在特定路径上? 我想省略每个子目录,只保留文件的最大最小深度= 1。我尝试了以下方法,但不起作用:

  • 问题内容: 我目前有一个PdfReader和一个PdfStamper,我正在用它们填充acrofields。现在,我必须将另一张pdf复制到我一直填写的表格的末尾,当我这样做时,我会在新表格上丢失acrofield。这是代码。 我创建原始文档的方式是这样的。 有没有一种方法可以使用第一段代码合并并将两个acrofield合并在一起? 问题答案: 根据您的确切需求,可能会出现不同的情况,但是无论如何

  • 我想只从我的两个对象数组和中得到那些符合标准的子文档。即使我已经找到了这个stackoverflow答案#2(根据标准查找猫鼬子文档),它对我来说并不像期望的那样工作,或者我错过了一些东西。 我的文档如下所示: 它将在和中打印项目及其所有子文档。但是,我只想获取与给定上载id匹配的子文档。我做错了什么? 编辑:这个问题是指用猫鼬来解决它。我不能在Mongoose中使用这个问题的集合语句(只检索Mo

  • 我需要使用set()和{mer: true}将文档推送到我的Firebase FiRecovery数据库。我不能使用update(),因为我不能保证文档事先存在。 如果我使用角度 我尝试在Python中做同样的事情: 但我得到了一个错误: ValueError("无效的合并路径:{}". form(merge_path))ValueError:无效的合并路径: FieldPath('合并') 删除

  • 我想从ElasticSearch的结果文档中排除一个字段。我浏览了ElasticSearch.org的这个文档http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-fields.html但当我尝试时,这不起作用。我在SO上看到了同样的问题。有没有办法在Elasticsearch查询中