【问题标题】:Mongoose Find not filtering for object property inside array (MongoDB 4.4.1)Mongoose Find 不过滤数组内的对象属性(MongoDB 4.4.1)
【发布时间】:2020-12-01 00:31:10
【问题描述】:

我一直在尝试制作一个聊天应用程序,并且我使用以下架构来发送消息:


const messageObject = {
    sender:  {type: mongoose.Schema.Types.ObjectId, ref: 'User', require: true},
    message: {type: String, require: true, min: 1, max: global.messageMaxLength},
    time: Number,
    seen: Boolean
}
const MessageSchema = mongoose.Schema({
    _id: {type: mongoose.Schema.Types.ObjectId, ref: 'User', require: true},
    messages: [messageObject]
}, {versionKey: false}) ;

module.exports = mongoose.model('Messages', MessageSchema);

它成功地接收条目。条目示例:

 "_id": "5fb3d971e6092d2da001bbad",
        "messages": [
            {
                "_id": "5fc58bfe0e0ffb313c27fa0a",
                "message": "Hello user",
                "time": 1606781949959,
                "seen": false
            },
            {
                "_id": "5fc58c010e0ffb313c27fa0b",
                "message": "Hello user",
                "time": 1606781953442,
                "seen": false
            },
            {
                "_id": "5fc58c020e0ffb313c27fa0c",
                "message": "Hello user",
                "time": 1606781954137,
                "seen": false
            }
        ]
    }

我现在只想要seen:false 消息,但是当我尝试在查找或聚合中编写代码时,我得到了所有数据,即上述记录:

MessageModel.find({$and: [{_id: req.userData.userid}, {'messages.seen': false}]}).then(result => {
        res.status(200).json({
            message: "passed",
            result,
        });
    })

但是,如果我给出{"messages.seen": null}},它可以正常工作并返回 [],并且 1 个带有 seen: null 的条目将返回整个数组。

我看过所有论坛,没有人遇到过这种错误。请帮忙。

谢谢

【问题讨论】:

    标签: node.js json mongodb mongoose


    【解决方案1】:

    您的消息对象嵌套在文档中,Mongo 只会返回完整文档或您投影的特定顶级字段。 Mongo 不会过滤掉嵌套数组中的对象(就像您的架构一样)。因此,如果数组中的任何消息对象与选择器匹配,则整个文档本身都会通过匹配并作为结果返回。

    您的选择是:

    1. 过滤掉代码中的真/假消息
    2. 更改您的数据库结构,以便您拥有一个单独的消息集合,其中每个文档都是一条消息。因此,在您的示例中,集合如下所示:
                {
                    "_id": "5fc58bfe0e0ffb313c27fa0a",
                    "parentId": "5fb3d971e6092d2da001bbad",
                    "message": "Hello user",
                    "time": 1606781949959,
                    "seen": false
                },
                {
                    "_id": "5fc58c010e0ffb313c27fa0b",
                    "parentId": "5fb3d971e6092d2da001bbad",
                    "message": "Hello user",
                    "time": 1606781953442,
                    "seen": false
                },
                {
                    "_id": "5fc58c020e0ffb313c27fa0c",
                    "parentId": "5fb3d971e6092d2da001bbad",
                    "message": "Hello user",
                    "time": 1606781954137,
                    "seen": false
                }
    

    然后您可以使用以下命令查询该集合:

    { "parentId": "5fb3d971e6092d2da001bbad","seen": false}

    【讨论】:

    • 非常感谢您的回答 Hemal。我会改变我的架构。
    猜你喜欢
    • 2020-03-14
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 2018-05-18
    • 2018-12-25
    相关资源
    最近更新 更多