猫鼬-查询文档是否元素不在数组中

时间:2020-11-09 19:30:00

标签: node.js mongodb express mongoose mongoose-schema

我在查询通知架构时遇到了问题

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

真的很感谢您的帮助,在这里呆了好几天。

1 个答案:

答案 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