node.js - Mongoose Find 不过滤数组内的对象属性(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
现在只想要消息,但是当我尝试在查找或聚合中对其进行编码时,我得到了所有数据,即上述记录:
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 不会过滤掉嵌套数组中的对象(就像您的架构一样)。因此,如果数组中的任何消息对象与选择器匹配,则整个文档本身都会通过匹配并作为结果返回。
您的选择是:
- 过滤掉代码中的真/假消息
- 更改您的数据库结构,以便您拥有一个单独的消息集合,其中每个文档都是一条消息。因此,在您的示例中,该集合将如下所示:
{
"_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}
推荐阅读
- angular - 引导程序的导航药丸不适用于角度
- laravel - 使用警卫登录正在重定向到空白页面
- android - 无法从 Android Studio 中的布局中引用任何 ID
- python - 更改循环提示
- c# - 此类型名称中的 #(哈希)是什么意思?
- php - 我可以通过检查我的数据库有多少行来获得 SQL 注入吗?
- angular - ie11中的Angular ngModel选择
- database - 如何将访问备份为压缩文件?
- javascript - 如何使用 Google Apps 脚本对 SaxoTrader 进行身份验证
- python - 如何将整个numpy数组作为python中的参数传递给用户定义的函数?