从mongoose对象数组中获取切片对象

时间:2018-01-04 18:38:33

标签: mongoose

我在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中查询这个?

1 个答案:

答案 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) {}