大佬们,这个有点复杂的 mongodb 查询该怎么写呢?
下面结构的数据记录,如何写 mongodb的 查询呢
查询 meta 下各字段的 timestampOccur,符合指定日期范围内的记录
{
"_id": {
"$oid": "648c3779213eb4a742966793"
},
"campaign": {
"$oid": "6486c919419fae8b33394653"
},
"status": "Enabled",
"workflow": {
"$oid": "6486c91d419fae8b33394659"
},
"user": {
"$oid": "64897fc8da355f8b0d629db5"
},
"basic": {
"email": "aaa@qq.com",
"salesTeam": "ahg",
"poc": "e",
"company": "厦谷"
},
"type": {
"3-nominated": "Y",
"event-attend": "Y"
},
"createdAt": {
"$date": "2023-06-16T10:20:41.421Z"
},
"updatedAt": {
"$date": "2023-06-19T10:18:02.329Z"
},
"tag": [],
"code": "enT7957116",
"meta": {
"aaa": { // 注意,这里的aaa,每条数据都不一样,随机的名称
"timestampOccur": [
{
"$date": "2023-06-19T10:18:02.000Z" // 这个是 Date 类型
}
]
},
"bbb": {
"timestampOccur": [
{
"$date": "2023-06-19T02:59:05.000Z"
}
]
}
}
}
回复
1个回答

test
2024-07-01
关于,这个问题,我直接贴代码把,哈哈哈,敲了一中午
db.collection.aggregate([
// 匹配符合条件的记录
{
$match: {
"meta.timestampOccur": {
$elemMatch: {
$gte: ISODate("2023-06-18T00:00:00.000Z"),
$lt: ISODate("2023-06-20T00:00:00.000Z")
}
}
}
},
// 展开 meta 对象,方便后续操作
{
$project: {
_id: 1,
campaign: 1,
status: 1,
workflow: 1,
user: 1,
basic: 1,
type: 1,
createdAt: 1,
updatedAt: 1,
tag: 1,
code: 1,
meta: {
$objectToArray: "$meta"
}
}
},
// 将 meta 对象转换为数组,方便后续操作
{
$unwind: {
path: "$meta",
includeArrayIndex: "metaIndex"
}
},
// 如果 meta.timestampOccur 符合日期范围,则输出记录
{
$match: {
"meta.v.timestampOccur": {
$elemMatch: {
$gte: ISODate("2023-06-18T00:00:00.000Z"),
$lt: ISODate("2023-06-20T00:00:00.000Z")
}
}
}
},
// 重新构建 meta 对象
{
$group: {
_id: "$_id",
campaign: { $first: "$campaign" },
status: { $first: "$status" },
workflow: { $first: "$workflow" },
user: { $first: "$user" },
basic: { $first: "$basic" },
type: { $first: "$type" },
createdAt: { $first: "$createdAt" },
updatedAt: { $first: "$updatedAt" },
tag: { $first: "$tag" },
code: { $first: "$code" },
meta: {
$push: {
k: "$meta.k",
v: "$meta.v"
}
}
}
},
// 将 meta 对象转换回原始格式
{
$project: {
_id: 1,
campaign: 1,
status: 1,
workflow: 1,
user: 1,
basic: 1,
type: 1,
createdAt: 1,
updatedAt: 1,
tag: 1,
code: 1,
meta: {
$arrayToObject: "$meta"
}
}
}
])
代码注释未标明的地方及解释:match用于匹配符合日期范围内的记录,并将meta对象展开为数组;unwind 用于将 meta 对象转换为数组,方便后续操作;group用于重新构建meta对象;group用于重新构建meta对象;project 用于将 meta 对象转换回原始格式。
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容