MongoDB凝结:基于价值的分组并获得多个计数

发布于 2025-02-08 23:26:00 字数 1118 浏览 1 评论 0原文

我有以下内容:

[  
  { _id: 610b678502500b0646923801, feeling: 'dislike' },
  { _id: 610b678502500b0646923629, feeling: 'like' },
  { _id: 610b67a602500b064693a667, feeling: 'love' },
  { _id: 610b678d02500b06469290fd, feeling: 'like' },
  { _id: 610b678502500b06469238f3, feeling: 'love' },
  { _id: 610b678502500b06469237ed, feeling: 'love' },
  { _id: 610b678502500b064692389e, feeling: 'like' },
  { _id: 610b678502500b0646923bd8, feeling: 'love' },
  { _id: 610b678502500b06469237e0, feeling: 'love' },
  { _id: 610b678502500b0646923674, feeling: 'love' },
  { _id: 610b680b02500b0646981b3a, feeling: 'dislike' },
  { _id: 610b678702500b0646925096, feeling: 'love' },
  { _id: 610b678502500b0646923810, feeling: 'like' },
  { _id: 610b678d02500b06469292fb, feeling: 'dislike' },
  { _id: 610b678502500b06469238b4, feeling: 'like' }
  ...
]

我想按_id进行分组,并显示每种感觉的项目数。预期的结果是:

[ 
  {
    _id: 610b678502500b0646923801, 
    love: 2, 
    like: 4, 
    dislike: 6
  },
  {
    _id: 610b678502500b06469237ed, 
    love: 8, 
    like: 2, 
    dislike: 5
  }
  ...
]

I have the following in an aggregation:

[  
  { _id: 610b678502500b0646923801, feeling: 'dislike' },
  { _id: 610b678502500b0646923629, feeling: 'like' },
  { _id: 610b67a602500b064693a667, feeling: 'love' },
  { _id: 610b678d02500b06469290fd, feeling: 'like' },
  { _id: 610b678502500b06469238f3, feeling: 'love' },
  { _id: 610b678502500b06469237ed, feeling: 'love' },
  { _id: 610b678502500b064692389e, feeling: 'like' },
  { _id: 610b678502500b0646923bd8, feeling: 'love' },
  { _id: 610b678502500b06469237e0, feeling: 'love' },
  { _id: 610b678502500b0646923674, feeling: 'love' },
  { _id: 610b680b02500b0646981b3a, feeling: 'dislike' },
  { _id: 610b678702500b0646925096, feeling: 'love' },
  { _id: 610b678502500b0646923810, feeling: 'like' },
  { _id: 610b678d02500b06469292fb, feeling: 'dislike' },
  { _id: 610b678502500b06469238b4, feeling: 'like' }
  ...
]

I want to group by _id, and show the number of items for each feeling. The expected results would be:

[ 
  {
    _id: 610b678502500b0646923801, 
    love: 2, 
    like: 4, 
    dislike: 6
  },
  {
    _id: 610b678502500b06469237ed, 
    love: 8, 
    like: 2, 
    dislike: 5
  }
  ...
]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

白首有我共你 2025-02-15 23:26:00

查询

  • 查询组按ID进行
  • 组,因为我们知道我们只有3个可能的组,我们创建这些组并基于条件,如果感觉与字段名称1匹配,否则0

playmongo

aggregate(
[{"$group": 
   {"_id": "$id",
    "dislike": 
     {"$sum": {"$cond": [{"$eq": ["$feeling", "dislike"]}, 1, 0]}},
    "like": {"$sum": {"$cond": [{"$eq": ["$feeling", "like"]}, 1, 0]}},
    "love": {"$sum": {"$cond": [{"$eq": ["$feeling", "love"]}, 1, 0]}}}}])

Query

  • group by id
  • because we know that we have only 3 possible groups, we create those groups and sum based on condition, if feeling match with the field name 1 else 0

Playmongo

aggregate(
[{"$group": 
   {"_id": "$id",
    "dislike": 
     {"$sum": {"$cond": [{"$eq": ["$feeling", "dislike"]}, 1, 0]}},
    "like": {"$sum": {"$cond": [{"$eq": ["$feeling", "like"]}, 1, 0]}},
    "love": {"$sum": {"$cond": [{"$eq": ["$feeling", "love"]}, 1, 0]}}}}])
梦里人 2025-02-15 23:26:00

也许是这样的:

db.collection.aggregate([
 {
  $unwind: "$feeling"
 },
 {
  $group: {
  _id: {
    i: "$_id",
    f: "$feeling"
   },
  cnt: {
    $sum: 1
  }
  }
  },
 {
$project: {
  _id: "$_id.i",
  a: [
    {
      k: "$_id.f",
      v: "$cnt"
    }
  ]
 }
},
{
$group: {
  _id: "$_id",
  s: {
    "$mergeObjects": {
      "$arrayToObject": "$a"
     }
    }
   }
 },
 {
  $replaceRoot: {
    newRoot: {
      $mergeObjects: [
       "$s",
       "$ROOT"
     ]
    }
  }
 },
 {
  $project: {
    s: 0
  }
 }
])

解释:

  1. 在放松阶段,请放松一下,模拟重复的_id--

在您的聚合中,您需要从这里继续 -

  1. 基于_id&感觉要有计数每次求职
  2. 项目适用于
  3. 带有MergeObjects + ArrayToObject的ArrayTooBject键/值组,以接收每个感觉的计数,
  4. 用合并的_ID +计数项目替换根,
  5. 以删除临时变量“ S”

Playground

Perhaps something like this:

db.collection.aggregate([
 {
  $unwind: "$feeling"
 },
 {
  $group: {
  _id: {
    i: "$_id",
    f: "$feeling"
   },
  cnt: {
    $sum: 1
  }
  }
  },
 {
$project: {
  _id: "$_id.i",
  a: [
    {
      k: "$_id.f",
      v: "$cnt"
    }
  ]
 }
},
{
$group: {
  _id: "$_id",
  s: {
    "$mergeObjects": {
      "$arrayToObject": "$a"
     }
    }
   }
 },
 {
  $replaceRoot: {
    newRoot: {
      $mergeObjects: [
       "$s",
       "$ROOT"
     ]
    }
  }
 },
 {
  $project: {
    s: 0
  }
 }
])

Explained:

  1. At the unwind stage just unwinding to simulate duplicated _id

--- in your aggregation you need to continue from here ---

  1. Group based on _id & feeling to have the count per feeling
  2. Project the counts to suitable for arrayToObject key/values
  3. Group with mergeObjects + arrayToObject to receive the count per feeling
  4. Replace the root with merged _id + counts
  5. Project to remove the temporary variable "s"

Playground

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文