我在mongoose架构中有以下模型。在此模型中,Messages是对象数组。
{
"_id" : ObjectId("5a4e6e0f003db94a2c6e52d3"),
"IsGroup" : false,
"GroupName" : "Group1",
"Messages" : [
ObjectId("5a4e6e53003db94a2c6e52d4"),
ObjectId("5a4e6e56003db94a2c6e52d5"),
ObjectId("5a4e6e58003db94a2c6e52d6"),
ObjectId("5a4e6e5b003db94a2c6e52d7"),
ObjectId("5a4e6e60003db94a2c6e52d8"),
ObjectId("5a4e6e63003db94a2c6e52d9"),
ObjectId("5a4e6e65003db94a2c6e52da"),
ObjectId("5a4e6e68003db94a2c6e52db"),
ObjectId("5a4e6e72003db94a2c6e52dc"),
ObjectId("5a4e6e77003db94a2c6e52dd"),
ObjectId("5a4e6e7d003db94a2c6e52de"),
ObjectId("5a4e6e80003db94a2c6e52df")
]
"__v" : 0
}
我试图从阵列中获取最后5条消息。 我通过以下代码实现了这一点。模特是我的模特。
Model.UserGroupModel.findById(GroupId)
.select({ Messages: { '$slice':-5}})
.exec(function (err, GroupResult) {
}
但我的挑战是获得下一个需要从前一个项目开始的前5个元素。
例如:在第一个结果中,我必须得到以下结果。
ObjectId("5a4e6e68003db94a2c6e52db"),
ObjectId("5a4e6e72003db94a2c6e52dc"),
ObjectId("5a4e6e77003db94a2c6e52dd"),
ObjectId("5a4e6e7d003db94a2c6e52de"),
ObjectId("5a4e6e80003db94a2c6e52df")
在下一个请求中我必须得到。我将传递先前返回的objectId(" 5a4e6e68003db94a2c6e52db")的输入,以获取下一个结果起始点的位置。
ObjectId("5a4e6e58003db94a2c6e52d6"),
ObjectId("5a4e6e5b003db94a2c6e52d7"),
ObjectId("5a4e6e60003db94a2c6e52d8"),
ObjectId("5a4e6e63003db94a2c6e52d9"),
ObjectId("5a4e6e65003db94a2c6e52da"),
如何在mongoose中查询这个?
答案 0 :(得分:2)
您可以尝试使用以下聚合函数来获取3.4版本中的下一个记录。
Model.UserGroupModel.aggregate([
{"$match":{"_id":GroupId,"Messages":MessageId}},
{"$project":{
"Messages":{
"$slice":[
"$Messages",
{"$subtract":[{"$indexOfArray":["$Messages",MessageId]},5]}
,5
]
}
}}
]).exec(function (err, GroupResult) {}