首页 > 解决方案 > 在 mongo 中查找嵌套字段与值匹配的示例文档

问题描述

我收集了数百万条记录,这里有一些示例文档

{
    _id: ObjectId("003fjasf0234j03j0349")
    FirstLayer: {
        SecondLayer: {
            Status: {
                9428f:{
                    active: "Active"
                }
            }
        }
    }
}

{
    _id: ObjectId("qg3o4034034nr34343")
    FirstLayer: {
        SecondLayer: {
            Status: {
                9428f:{
                    active: "Active"
                }
            }
        }
    }
}

{
    _id: ObjectId("293je2odjojwe0f23")
    FirstLayer: {
        SecondLayer: {
            Status: {
                00fekw:{
                    active: "Not Active"
                }
            }
        }
    }
}

我想从 monogdb 中获取一些示例文档,其中active: "Active". 我想出了这个:

db.Collection.aggregate([
  {$match:{"FirstLayer.SecondLayer.Status.9428f.active": "Active"}},
  {$sample:{size: 50}}
  ])

它可以工作,但问题是里面的子文档Stauts {}有不同的文档名称(例如:给定示例文档中的“9428f”、“00fekw”)。所以我不能硬编码“活动”字段的路径。

还有其他方法吗?

标签: mongodbmongodb-queryaggregation-framework

解决方案


我认为在 MongoDB 中没有任何直接的方法来处理这种情况,

你可以试试,

方法一:

  • $set在使用键值格式将其转换为数组后添加一个字段Status以分配值Status$objectToArray
  • $match匹配状态条件
  • $unset删除Status字段,因为它不需要
  • $sample你的文件
db.collection.aggregate([
  { $set: { Status: { $objectToArray: "$FirstLayer.SecondLayer.Status" } } },
  { $match: { "Status.v.active": "Active" } },
  { $unset: "Status" },
  { $sample: { size: 50 } }
])

操场

方法二:

条件匹配表达式$expr,可以在条件中使用聚合运算符,

  • $let创建一个变量status以从对象中获取状态数组并in过滤状态数组并获取active状态,
  • $size获取上述过滤结果的大小
  • 表达式将检查大小是否不为零,然后返回结果
db.collection.aggregate([
  {
    $match: {
      $expr: {
        $let: {
          vars: { status: { $objectToArray: "$FirstLayer.SecondLayer.Status" } },
          in: {
            $size: {
              $filter: {
                input: "$$status",
                cond: { $eq: ["$$this.v.active", "Active"] }
              }
            }
          }
        }
      }
    }
  },
  { $sample: { size: 50 } }
])

操场


推荐阅读