我真的不知道如何返回对象数组内的嵌套字段。这是我的架构:
const chat = new Schema({
id: {
type: String,
required: true
},
channels: [
{
id: {
type: String
},
messages: [
{
author: String,
body: String,
created_at: Date,
_id: false,
avatar: String
}
]
}
]
})
我想通过使用聊天ID和用户提供的特定范围(0-49、50-99等)中的频道ID来接收50条频道消息。
所以最后我从该通道接收了对象数组。
const messages = [{...}, {...}, ...]
答案 0 :(得分:1)
为此,我将使用聚合管道。我没有用过猫鼬,但对于基本的mongo查询,它看起来像:
db.getCollection("collection").aggregate(
[
{
//find the matching documents
"$match" : {
"id" : "chatid",
"channels.id" : "channelid"
}
},
{
//split the document into the individual messages
"$unwind" : "$channels.messages"
},
{
"$match" : {
"channels.id" : "channelid"
}
},
{
//limit to 50 (can be after the project stage)
"$limit" : 50
},
{
//update to just return the message subdoc
"$replaceRoot" : {
"newRoot" : "$channels.messages"
}
}
]
);
对于猫鼬,请查看聚合API或聚合中间件文档以实现此目的
答案 1 :(得分:1)
第一个答案的另一种变化形式是实际上仅返回所需的频道,而不是全部返回。
db.getCollection("collection").aggregate(
[
{
"$match" : {
"id" : chatid
}
},
{
"$unwind" : "$channels"
},
{
"$match" : {
"channels.id" : channelid
}
},
{
"$project" : {
"messages" : {
"$slice" : [
"$channels.messages",
0.0,
50.0
]
}
}
}
]
);