模型:
const Room = new Schema({
topic: String,
messages: [{
text: String,
readByUsers: [String] // Array of users Ids, which read this message
}]
});
示例数据:
{
topic: 'First',
messages: [
{
text: 'First message',
readByUsers: ['id1', 'id3', 'id2']
},
{
text: 'Second message',
readByUsers: ['id1', 'id2'] //id3 not read this
}
]
},
{
topic: 'Second',
messages: [
{
text: 'Third message',
readByUsers: ['id1', 'id3', 'id2']
},
{
text: 'Fourth message',
readByUsers: ['id1', 'id2', 'id3']
}
]
}
我的目标-接收第一个对象,因为ID3用户未读取第二条消息(readbyusers数组中不存在此密钥)。
查询方式:
搜索所有文档,其中某些messages.readbyusers不包含特定的用户ID
Model.find(messages.readByUsers: {$nin: [userId]})
仅当没有消息时有效。例如,readbyusers不包含id
Model.find(messages.readByUsers: {$nin: ['id4']})
-返回两个对象 最佳答案
您可以使用$elemMatch
运算符来执行此操作,该运算符查找至少一个满足其条件的元素:
Model.find({messages: {$elemMatch: {readByUsers: {$ne: 'id3'}}}})