【问题标题】:MongoDB array of objectsMongoDB 对象数组
【发布时间】:2020-09-03 20:16:44
【问题描述】:

我面临的问题如下:

我有一个MongoDB文档,其结构如下

"name": "XYZ",
"array":[
 {
  "value": "Alpha"
 },
 {
  "value": "Beta"
 },
 {
  "value": "Alpha"
 },
]

我必须计算有多少对象具有 Alpha 值。 我尝试了以下两个查询,但都只给了我 1 的值。

db.current_database.find({array: {$elemMatch: {value: "Alpha"}}}).count()
db.current_database.find({'array.value': 'Alpha'}).count()

【问题讨论】:

    标签: arrays mongodb object


    【解决方案1】:

    find 集合方法返回文档,而不是片段。

    计算数组中元素出现次数的几个选项:

    大多数语言都提供了一种过滤/减少/计数数组中元素的方法,因此这在客户端应该相当简单。

    MongoDB 聚合框架提供了$reduce$filter$size$group$unwind 以及其他一些可能在这种情况下有用的运算符。

    使用$reduce 的一种可能解决方案:

    db.current_database.aggregate([
      {$match: {"array.value": "Alpha"}},
      {$addFields:{
          count: {
              $reduce: {
                  input: "$array",
                  initialValue: 0,
                  in: {
                      $cond: {
                         if: {$eq: ["$$this.value", "Alpha"]},
                         then: {$sum: ["$$value", 1]},   
                         else: "$$value"
                      }
                   }
               }
           }
      }}
    ])
    

    【讨论】:

    • 我收到错误“2020-09-17T13:02:19.163-0500 E QUERY [js] 错误:命令失败:{“ok”:0,“errmsg”:“使用未定义的变量: value”,“code”:17276,“codeName”:“Location17276”}:聚合失败:_getErrorWithCode@src/mongo/shell/utils.js:25:13 doassert@src/mongo/shell/assert.js:18: 14 _assertCommandWorked@src/mongo/shell/assert.js:536:17 assert.commandWorked@src/mongo/shell/assert.js:620:16 DB.prototype._runAggregate@src/mongo/shell/db.js:260 :9 DBCollection.prototype.aggregate@src/mongo/shell/collection.js:1062:12 @(shell):1:1"
    • 您的测试运行与mongoplayground.net/p/fIJmJxuFJfR 有何不同?
    • 对不起,我只是搞砸了关键字“价值”。现在,这确实返回了一个文档,怎么可能只得到一个值。
    • 所有 mongodb 查询和命令都返回一个文档或游标。您可以使用$project 来限制返回的字段。驱动程序或外壳程序可能具有显示一个字段值的便利功能。例如,将 .next().count 添加到 shell 中的示例查询将仅返回第一个文档中 count 字段的值。
    猜你喜欢
    • 2023-02-14
    • 1970-01-01
    • 2019-02-10
    • 2015-02-25
    • 2021-09-24
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多