Mongoose聚合与计数和分组

时间:2017-03-15 22:57:41

标签: javascript mongodb mongoose

我希望找到与网址匹配但返回自定义对象的记录。

我有这个模特..

const ReactionSchema = mongoose.Schema({
  url: {
    type: String,
    required: true
  },

  emoji: {
    type: String,
    enum: ['happy', 'sad', 'angry'],
    required: true
  },

  ip: {
    type: String
  }
})

我想查询该模型并匹配url,但会返回如下所示的响应:

[
  {
    "emoji": "happy",
    "count": 4,
    "reacted": true
  },
  {
    "emoji": "sad",
    "count": 9,
    "reacted": false
  },
  {
    "emoji": "angry",
    "count": 7,
    "reacted": false
  }
]

我需要能够通过将记录的reacted与我在此过程中的变量进行比较来动态计算ip是否为真。

一次尝试

.aggregate([
  {$match: {url}},
  {$group: {
    _id: '$emoji',
    count: {$sum: 1}
  }}
])

但我似乎无法连接ips并查看我的变量IP是否在该数组中。

感谢您的帮助。我第一次问!

1 个答案:

答案 0 :(得分:0)

$push运算符添加到$group阶段以创建ip数组。

添加$project阶段,将_id重命名为emoji并计算reacted字段。

$setSubset将先前计算的ips数组与输入变量进行比较,并在输入变量数组是true数组的子集时返回ips

   aggregate([
      {$match: {url}},
      {$group: {
        _id: "$emoji",
        count: {$sum: 1},
        ips:{$push:"$ip"}
      }},
      {$project:{_id:0, emoji:"$_id",count:1, reacted:{ $setIsSubset: [[variableip], "$ips" ] }
      }}
    ])