mongodb - 在 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”)。所以我不能硬编码“活动”字段的路径。
还有其他方法吗?
解决方案
我认为在 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 } }
])
推荐阅读
- javascript - 如何从服务总线队列中获取 QueueDetails?
- r - 合并最近的前一个日期和日期之间
- python - 如何将输出保存为 .txt 文件?
- flutter - 在 Flutter 中是否可以在同一个小部件中显示图像和视频,有没有通用的小部件?
- visual-studio-code - 如何在 Visual Studio Code 的 tmux 会话中从终端打开文件
- c# - 更新没有“循环”和“如果”的列表项的属性
- javascript - 如何折叠修改后的缩小 javascript 代码
- typescript - 使用 index.ts 文件从文件夹导出打字稿会引发错误 TS2307
- c# - 绑定变量性能问题
- node.js - Nestjs 在 lambda 函数上运行而不创建实际的服务器来与 AWS API Gateway 结合?