如何解决mongodb-在聚合框架中查找上一个和下一个文档
在我的收藏中应用了很长的流水线之后,我可以获得以下内容:
{
{
"_id": "main1","title": "First","code": "C1","subDoc": {
"active": true,"sub_id": "main1sub1","order": 1
}
},{
"_id": "main2","title": "Second","code": "C2","sub_id": "main2sub1",{
"_id": "main3","title": "Third","code": "C3","subDoc": {
"active": false,"sub_id": "main3sub1","order": 1
}
}
}
文档已经按照正确的顺序排列。现在,我必须找到与给定参数相对应的文档之前或之后的文档。例如,如果我知道{“ code”:“ C2”},则必须检索以前的文档(示例文档中带有“ code”:“ C1”)。
我只需要获取该文件,而无需其他文件。
我知道如何使用find()方法并依次应用sort()和limit(),但是我想直接在聚合管道中获取文档,并添加必要的步骤。
>我尝试了$ indexOfArray和$ arrayElemAt的一些组合,但是遇到的第一个问题是我没有数组,而只是文档。
第二个问题是我知道的参数有时可能在子文档中,例如{“ sub_id”:“ main3sub1”},并且我应该始终将上一个或下一个父文档作为响应(在示例中) ,管道应返回文档“ main2”作为上一个文档)
我将集合插入mongoplayground以便能够快速执行测试:
有什么主意吗?
解决方法
如果只想检索以前的文档,请使用以下查询:
第一种方法:
使用$ match,$ sort,$ limit
db.collection.aggregate([
{
$match: {
code: {
"$lt": "C2"
}
}
},{
"$sort": {
code: -1
}
},{
$limit: 1
}
])
第二种方法:
如@ Wernfried Domscheit所指定, 转换为数组,然后使用$ arrayElemAt
db.collection.aggregate([
{
$group: {
_id: null,data: {
$push: "$$ROOT"
}
}
},{
$addFields: {
"index": {
$subtract: [
{
$indexOfArray: [
"$data.code","C2"
]
},1
]
}
}
},{
$project: {
_id: 0,data: {
$arrayElemAt: [
"$data","$index"
]
}
}
},{
$replaceRoot: {
newRoot: "$data"
}
}
])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。