Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 在mongo中查找嵌套字段与值匹配的示例文档_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

Mongodb 在mongo中查找嵌套字段与值匹配的示例文档

Mongodb 在mongo中查找嵌套字段与值匹配的示例文档,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我收集了数以百万计的记录,这里是一些样本文件 { _id: ObjectId("003fjasf0234j03j0349") FirstLayer: { SecondLayer: { Status: { 9428f:{ active: "Active" } }

我收集了数以百万计的记录,这里是一些样本文件

{
    _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”)。所以我不能硬编码到“活动”字段的路径


还有其他方法吗?

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

你可以试试

方法1:

  • $set
    添加一个字段
    Status
    ,在使用
    $objectToArray
    将其转换为键值格式的数组后,分配
    Status
    的值
  • $match
    匹配状态条件
  • $unset
    删除
    状态
    字段,因为它不需要
  • $sample
    您的文档

方法2:

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

  • $let
    创建一个vars
    状态
    从对象中获取状态数组,并在中过滤状态数组并获取活动状态
  • $size
    获取上述筛选结果的大小
  • 表达式将检查大小是否不为零,然后返回结果

提供的答案中是否有您认为无法解决您问题的内容?如果是这样,请对答案进行评论,以澄清哪些问题需要解决,哪些问题没有解决。@turivishal两种解决方案都有效。问题是我有20多个集合,每个集合包含数百万条记录。因此,从每个集合中提取样本需要相当长的时间。是的,这需要时间,因为我们不在动态字段中创建索引,可以在数组中创建索引,但在动态对象中不可能。@turivishal“active”字段将始终位于同一位置。是否有一种方法可以直接访问active,如“FirstLayer.SecondLayer.Status.9428f.active”,但我可以用一些占位符文档名替换动态子文档名9428f,如“FirstLayer.SecondLayer.Status.xxxxx.active”所以我可以直接使用匹配并快速获取记录?不,直接访问活动字段或替换动态字段是不可能的。
db.collection.aggregate([
  { $set: { Status: { $objectToArray: "$FirstLayer.SecondLayer.Status" } } },
  { $match: { "Status.v.active": "Active" } },
  { $unset: "Status" },
  { $sample: { size: 50 } }
])
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 } }
])