在对象数组中查找id字段并返回该对象的另一个字段

时间:2019-06-11 20:13:04

标签: node.js mongodb mongoose

我真的不知道如何返回对象数组内的嵌套字段。这是我的架构:

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 = [{...}, {...}, ...]

2 个答案:

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