簡體   English   中英

ZCCADCDEDB567ABAE643E15DCF0974E503Z 查找未過濾數組內的 object 屬性(MongoDB 4.4.1)

[英]Mongoose Find not filtering for object property inside array (MongoDB 4.4.1)

我一直在嘗試制作一個聊天應用程序,並使用以下架構來發送消息:


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消息,但是當我嘗試在 find 或聚合中對其進行編碼時,我得到了所有數據,即上述記錄:

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 的條目將返回整個數組。

我看過所有論壇,沒有人遇到過這種錯誤。 請幫忙。

謝謝

您的消息對象嵌套在文檔中,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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM