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
$expr
匹配,可以在条件中使用聚合运算符
创建一个vars$let
从对象中获取状态数组,并在中过滤状态数组并获取活动状态状态
获取上述筛选结果的大小$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 } }
])