我在查询通知架构时遇到了问题
receiver: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Profile' }],
readBy: [{
readerId: { type: mongoose.Schema.Types.ObjectId,
ref: 'Profile', default: [] },
readAt: { type: Date }
}]
为了查询最新通知,这是我编写的查询:
目标是要检查 readBy数组中是否存在“ profile.id ” 不(这表示该用户未读过它)
const notifications = await Notification.find({
receiver: profile.id, // this works
readBy: { // but, adding this returns an empty array
$elemMatch: {
readerId: { $ne: profile.id }
}
}
})
真的很感谢您的帮助,在这里呆了好几天。
答案 0 :(得分:2)
我认为比我们尝试做的要容易。
如果您想知道元素是否在数组中,请查询查找它。如果查询为空,则表示不存在,否则为。
看看这个example。
这是一个简单的查询,仅检查用户profile.id
是否已接收和读取一个文档。
db.collection.find([
{
"receiver": profile.id,
"readBy.readerId": profile.id
}
])
请检查输出是否符合预期,否则我误解了您的请愿书。
您可以在mongoose
中使用它:
var find = await model.find({"receiver":1,"readBy.readerId":1}).countDocuments()
它将返回与查询匹配的文档数量。
编辑以获取数组中不存在readerId
的文档:
在这里,您只需要添加$ne
运算符
db.collection.find([
{
"receiver": profile.id,
"readBy.readerId": {
"$ne": profile.id
}
}
])
您可以选中此here