模型:

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'}}}})

09-26 10:43