- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
如标题所述,我在使用 MongoDB 计算数组中的元素时遇到了一些麻烦。我有一个只有一个文档的数据库,制作如下:
{_id: ObjectId("abcdefghilmnopq"),
"Array": [
{field1: "val1",
field2: "val2",
field3: "val3",
...
},
{field1: "Value1",
field2: "Value2",
field3: "Value3",
...
},
...
]
}
我想计算数组中具有特定条件的元素的数量(例如 field1: "a"
,并计算所有具有 field1 = a
的元素) .我正在尝试使用这段代码:
db.collection.aggregate([
{ $unwind : {path: "$Array",
includeArrayIndex: "arrayIndex"}},
{ $match : { "Array.field1" : "a"}},
{ $project : { _id : 0,
Array : 1,
arrayIndex: 1,
total: {$size: "$Array"}}}
])
但我收到此错误:
Command failed with error 17124: 'The argument to $size must be anarray, but was of type: object' on server
我寻找了这个问题的几个答案,但我没有找到任何解决我的问题的方法。我的意思是,“数组”是一个数组!
最佳答案
错误是因为它在你之后不再是数组 $unwind
因此不再是 $size
的有效参数.
您似乎试图“合并”几个现有的答案,但不了解它们在做什么。你真正想要的是 $filter
和 $size
db.collection.aggregate([
{ "$project": {
"total": {
"$size": {
"$filter": {
"input": "$Array",
"cond": { "$eq": [ "$$this.field1", "a" ] }
}
}
}
}}
])
或使用 $reduce
“重新发明轮子” :
db.collection.aggregate([
{ "$project": {
"total": {
"$reduce": {
"input": "$Array",
"initialValue": 0,
"in": {
"$sum": [
"$$value",
{ "$cond": [{ "$eq": [ "$$this.field1", "a" ] }, 1, 0] }
}
}
}
}}
])
或者你试图用 $unwind
做什么,你其实 $group
再次“计算”有多少匹配项:
db.collection.aggregate([
{ "$unwind": "$Array" },
{ "$match": { "Array.field1": "a" } },
{ "$group": {
"_id": "$_id",
"total": { "$sum": 1 }
}}
])
前两种形式是现代 MongoDB 环境的“最佳”形式。 $unwind
的最终形式和 $group
是一种“遗留”构造,自 MongoDB 2.6 以来,这种类型的操作实际上并不是必需的,尽管使用了一些略有不同的运算符。
在前两个中,我们基本上是在比较 field1
每个数组元素的值,同时它仍然是一个数组。两者 $filter
和 $reduce
是现代运算符,旨在与现有阵列一起使用。使用聚合 $eq
对每个进行相同的比较运算符,它根据给定的参数是否“相等”返回一个 bool 值。在这种情况下,每个数组成员的预期值都是 "a"
.
在 $filter
的情况下,数组实际上保持完整,除了不满足 "cond"
中提供的条件的任何元素。从数组中删除。因为我们仍然有一个“数组”作为输出,所以我们可以使用 $size
运算符来测量处理该过滤条件后剩余的数组元素数。
$reduce
另一方面处理数组元素并为每个元素提供一个表达式和一个存储的“累加器”值,我们用 "initialValue"
初始化它.在这种情况下,相同的 $eq
测试在 $cond
内应用运算符(operator)。这是一个“三元”或if/then/else
条件运算符允许返回 bool 值的测试表达式返回 then
true
时的值或 else
false
时的值.
在那个表达式中我们返回 1
或 0
分别提供返回值和当前“累加器”相加的总体结果 "$$value"
与 $sum
运算符将它们加在一起。
使用的最终形式 $unwind
在阵列上。这实际上是解构数组成员,为每个数组成员创建一个“新文档”,它是原始文档中的相关父字段。这有效地为每个数组成员“复制”了主文档。
一旦你 $unwind
文件的结构改为"更扁平"的形式。这就是为什么您可以执行后续操作的原因 $match
管道阶段删除不匹配的文档。
这将我们带到了 $group
它用于“汇集”与公共(public) key 相关的所有信息。在这种情况下,它是 _id
原始文档的字段,当然会复制到 $unwind
生成的每个文档中.当我们回到这个作为单个文档的“公共(public)键”时,我们可以使用 $sum
来“计算”从数组中提取的剩余“文档”。蓄能器。
如果我们想要返回剩余的“数组”,那么您可以 $push
并只用剩余的成员重建数组:
{ "$group": {
"_id": "$_id",
"Array": { "$push": "$Array" },
"total": { "$sum": 1 }
}}
关于mongodb - 聚合计数数组成员匹配条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50641846/
我有一个 Cassandra 集群,里面有 4 个表和数据。 我想使用聚合函数(sum,max ...)发出请求,但我在这里读到这是不可能的: http://www.datastax.com/docu
我有以下两张表 Table: items ID | TITLE 249 | One 250 | Two 251 | Three 我投票给这些: Table: votes VID | IID | u
这个问题在这里已经有了答案: Update MongoDB field using value of another field (12 个答案) 关闭 3 年前。 我想根据另一个“源”集合的文档中
我的收藏包含以下文件。我想使用聚合来计算里面有多少客户,但我遇到了一些问题。我可以获得总行数,但不能获得总(唯一)客户。 [{ _id: "n001", channel: "Kalip
我有下表 Id Letter 1001 A 1001 H 1001 H 1001 H 1001 B 1001 H 1001 H 1001
得到一列的表 ABC。 “创建”的日期列。所以样本值就像; created 2009-06-18 13:56:00 2009-06-18 12:56:00 2009-06-17 14:02:0
我有一个带有数组字段的集合: {[ name:String buyPrice:Int sellPrice:Int ]} 我试图找到最低和最高买入/卖出价格。在某些条目中,买入或卖出价格为零
我有以下问题: 在我的 mongo db 中,我有以下结构: { "instanceId": "12", "eventId": "0-1b", "activityType":
下面给出的是我要在其上触发聚合查询的 Elasticsearch 文档。 { "id": 1, "attributes": [ { "fieldId": 1,
我正在使用 Django 的 aggregate query expression总计一些值。最终值是一个除法表达式,有时可能以零作为分母。如果是这种情况,我需要一种方法来逃避,以便它只返回 0。 我
我正在学习核心数据,特别是聚合。 当前我想要做的事情:计算表中在某些条件上具有逆关系的多对关系的记录数。 目前我正在这样做: NSExpression *ex = [NSExpression expr
我需要有关 Delphi 中的 ClientDatasets 的一些帮助。 我想要实现的是一个显示客户的网格,其中一列显示每个客户的订单数量。我将 ClientDataset 放在表单上并从 Delp
我的集合有 10M 个文档,并且有一个名为 movieId 的字段;该文档具有以下结构: { "_id" : ObjectId("589bed43e3d78e89bfd9b779"), "us
这个问题已经有答案了: What is the difference between association, aggregation and composition? (21 个回答) 已关闭 9
我在 elasticsearch 中有一些类似于这些示例的文档: { "id": ">", "list": [ "a", "b", "c" ] } { "id"
我正在做一些聚合。但是结果完全不是我所期望的,似乎它们没有聚合索引中与我的查询匹配的所有文档,在这种情况下 - 它有什么好处? 例如,首先我做这个查询: {"index":"datalayer","t
假设我在 ES 中有这些数据。 | KEY | value | |:-----------|------------:| | A |
可能在我的文档中,我有一个被分析的文本字段。我只是在ElasticSearch AggregationAPI中迷路了。我需要2种不同情况的支持: 情况A)结果是带有计数标记(条款)的篮子下降。 情况B
我正在为网上商店构建多面过滤功能,如下所示: Filter on Brand: [ ] LG (10) [ ] Apple (5) [ ] HTC (3) Filter on OS: [ ] Andr
我有一个父/子关系并且正在搜索 child 。 是否可以在父属性上创建聚合? 例如parent 是 POST,children 是 COMMENT。如果父项具有“类别”属性,是否可以搜索 COMMEN
我是一名优秀的程序员,十分优秀!