问题描述
await db
.collection("threads")
.find({
_id: ObjectId(req.query.thread_id),})
.project({
messages: {
$slice: [parseInt(req.query.offset),parseInt(req.query.limit)],},_id: 1,date_created: 1,})
.toArray();
限制和偏移量由客户端设置,以支持无限加载。问题是查询按添加顺序获得结果,而查询应首先与最后添加的消息分页。我该怎么办?是否有可能在获取数据之前对数组进行反向操作?或者负载太大?
这是我的线程模式:
{
"_id":{
"$oid":"5f7b32c014014100176c2a55"
},"thread_name":"personal","messages":[
{
"_id":{
"$oid":"5f7b32d414014100176c2a56"
},"sender":{
"$oid":"5f7b329114014100176c2a52"
},"type":"text","date_created":{
"$date":"2020-10-05T14:51:00.716Z"
},"content":"hi"
},{
"_id":{
"$oid":"5f7b32df14014100176c2a57"
},"date_created":{
"$date":"2020-10-05T14:51:11.302Z"
},"content":"hello"
},],"date_created":{
"$date":"2020-10-05T14:50:40.271Z"
},}
解决方法
您可以在聚合中使用$reverseArray
选项
使用aggregate
,您可以先使用$match
(它将替换您的find
部分),然后使用$project
,您可以添加新属性,例如{{1 }},您将在其中结合使用$reverseArray和$slice
所以,查询应该是这样的
reversedMessages
,
“是否有可能在取回之前可以反转数组?”您无法扭转自己没有的东西。我已经看到了$reverseArray
的另一个答案,但是为什么只花$slice个最后一个元素就花一些资源来反转数组呢?
如果为负,则$ slice返回数组中的最后n个元素。如果指定n,则无法解析为负数
db.collection("threads").aggregate([
{
$match: {
_id: ObjectId(req.query.thread_id),},{
$project: {
_id: 1,date_created: 1,reverseMessages: {
$slice: [
"$messages",parseInt(req.query.limit) * -1
]
}
}
}
]);