以下是MongoDB查询。用Mongoose编写此查询的最佳方法是什么?
db.logs.find({date: db.logs.find({}, {date:1,"_id":0}).sort({date:-1}).limit(1).toArray()[0].date})
可能有多个具有相同日期的文档,我们需要检索所有与最新日期匹配的文档。
答案 0 :(得分:1)
聚合框架使它可以在单个查询中编写。您将需要具有初始 $lookup
运算符的管道进行自我联接,并在 $lookup
内对联接的集合执行管道允许不相关的子查询返回最新日期:
db.logs.aggregate([
{ "$lookup": {
"from": "logs",
"pipeline": [
{ "$sort": { "date": -1 } },
{ "$limit": 1 },
{ "$project": { "_id": 0, "date": 1 } }
],
"as": "latest"
} }
])
还需要进一步的步骤来重塑上面最新生产的新磁场,以使阵列变平。使用 $addFields
重塑形状,并使用 $arrayElemAt
展平阵列或使用 "$unwind"
:
db.logs.aggregate([
{ "$lookup": {
"from": "logs",
"pipeline": [
{ "$sort": { "date": -1 } },
{ "$limit": 1 },
{ "$project": { "_id": 0, "date": 1 } }
],
"as": "latest"
} },
{ "$addFields": { "latest": { "$arrayElemAt": ["$latest", 0] } } }
])
最后一步是在 $expr
阶段使用 $match
过滤结果管道中的文档,因为您将比较字段来自同一文档:
db.logs.aggregate([
{ "$lookup": {
"from": "logs",
"pipeline": [
{ "$sort": { "date": -1 } },
{ "$limit": 1 },
{ "$project": { "_id": 0, "date": 1 } }
],
"as": "latest"
} },
{ "$addFields": { "latest": { "$arrayElemAt": ["$latest", 0] } } },
{ "$match": {
"$expr": {
"$eq": [ "$date", "$latest.date" ]
}
} }
])
使查询进入猫鼬变得简单。