node.js - 计算值与数组不匹配的位置

标签 node.js mongodb mongoose mongodb-query aggregation-framework

我有以下优惠集合

这里readBy包含用户的_id... 现在我想计算 userId = "5add82620d7f5b38240c63d4"

的未读报价数量
{
    "_id" : ObjectId("5aeaab5ed6a9c97d0209260a"),
    "expiresIn" : ISODate("2018-05-30T18:30:00.000Z"),
    "name" : "Trip ",
    "readBy" : [ 
        ObjectId("5add82620d7f5b38240c63d4"),
        ObjectId("5add82620d7f5b38240c63c6")
    ],
    "__v" : 0
}
{
    "_id" : ObjectId("5aeaab7dd6a9c97d0209260b"),
    "expiresIn" : ISODate("2018-05-29T18:30:00.000Z"),
    "name" : "Trip",
    "readBy" : [ObjectId("5add82620d7f5b38240c63d4")],
    "__v" : 0
}
{
    "_id" : ObjectId("5aeae233d6a9c97d02092622"),
    "expiresIn" : ISODate("2018-05-25T18:30:00.000Z"),
    "name" : "two way off",
    "readBy" : [],
}
{
    "_id" : ObjectId("5aeae49643f10d284726069c"),
    "expiresIn" : ISODate("2018-05-25T18:30:00.000Z"),
    "name" : "two way off",
    "readBy" : [],
}
{
    "_id" : ObjectId("5aeae49743f10d284726069d"),
    "expiresIn" : ISODate("2018-05-25T18:30:00.000Z"),
    "name" : "two way off",
    "readBy" : []
}
{
    "_id" : ObjectId("5aeae49743f10d284726069e"),
    "expiresIn" : ISODate("2018-05-25T18:30:00.000Z"),
    "name" : "two way off",
    "readBy" : []
}

所以对于上面的集合,我的输出应该是

[{
  numberOfUnreadOffers: 4
}]

因为其中四个集合在 readBy 数组中没有 5add82620d7f5b38240c63d4

最佳答案

你基本上使用$setIsSubset$cond这里:

var userId= "5add82620d7f5b38240c63d4";

Model.aggregate([
  { "$group": {
    "_id": null,
    "numberOfUnreadOffers": {
      "$sum": {
        "$cond": {
          "if": { 
            "$setIsSubset": [[mongoose.Types.ObjectId(userId)], "$readBy"]
          },
          "then": 0,
          "else": 1
        }
      }
    }
  }}
]) 

当然,您还需要使用 mongoose.Types.ObjectId 将“字符串”“转换”为有效的 ObjectId 值。

但实际上,您可以通过简单的 count() 获得更好的性能相反:

Model.count({ "readBy": { "$ne": userId } })

所以你真的不应该为此使用 .aggregate()

关于node.js - 计算值与数组不匹配的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50210367/

相关文章:

php - Laravel 在 Controller 中手动检查 CSRF

node.js - 使用 PhantomJS/Node.js 将 HTML 转换为可搜索的 PDF

mongodb - 我们什么时候应该在 MongoDB 中使用嵌入式文档?

mongodb - 如何使用 feathersjs 处理多对少的 mongodb 关系?

node.js - Mongoose 在保存之前更新模型

Node.JS Express 4 - Mongoose 不保存数据

javascript - 类构造函数中选项对象的默认值

node.js - AzureAD JWT token 受众声明前缀使 JWT token 无效

javascript - 我应该怎么做聚合?

mongodb - 查询 mongodb 中的前 N ​​行