如何查询 mongodb 中指定日期范围内的 meta.timestampoccur
如何查询具有以下结构的数据记录中,meta 字段下各 timestampoccur 符合指定日期范围的记录?
{ ... "meta": { "aaa": { // 注意,这里的aaa,每条数据都不一样,随机的名称 "timestampoccur": [ { "$date": "2025-06-19t10:18:02.000z" // 这个是 date 类型 } ] }, "bbb": { "timestampoccur": [ { "$date": "2025-06-19t02:59:05.000z" } ] } } }
mongodb 查询
db.collection.aggregate([
// 匹配符合条件的记录
{
$match: {
"meta.timestampOccur": {
$elemMatch: {
$gte: ISODate("2025-06-18T00:00:00.000Z"),
$lt: ISODate("2025-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("2025-06-18T00:00:00.000Z"),
$lt: ISODate("2025-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"
}
}
}
]);代码详解