- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想找到 Mongo Document 中嵌套字段的所有唯一值的频率计数器。
更具体地说,如果我的集合说 db['sample'],包含以下文档 -
{'a' : 1, 'b' : {'c' : 25, 'd' : "x", 'e' : 36}},
{'a' : 2, 'b' : {'c' : 5, 'd' : "xx", 'e' : 36}},
{'a' : 33, 'b' : {'c' : 25, 'd' : "xx", 'e' : 36}},
{'a' : 17, 'b' : {'c' : 25, 'd' : "xxx", 'e' : 36}},
如何获取字段“d”的所有唯一值的频率计数器?即我的输出应该是 {'d' : { "xx": 2, "x": 1, "xxx": 1} }
这可能吗?感谢对此的任何帮助。谢谢。
我查找了聚合和 objectToArray 转换的文档,以将映射转换为数组,并在 PyMongo 中尝试了以下操作
1)
db['sample'].aggregate([ { "$addFields" : { "b" : {"$objectToArray" : "$b"}}},\
{"$unwind" : "$b"},\
{"$group" : { "_id" : "$b.k",\
"count" : {"$sum" : "$b.v"}}} ])
这给出了每个可能的字段的累积计数 - 例如 'c' : 25 + 5 + 25 + 25。
2)
db['sample'].aggregate([ { "$addFields" : { "b" : {"$objectToArray" : "$b"}}},\
{"$unwind" : "$b"}, \
{"$group" : { "_id" : "$b.k", \
"count" : {"$sum" : 1 }}} ])
这给出了字段在文档中出现的总次数 - 'c':4、'd':4 等。
最佳答案
你基本上是以错误的方式处理这个问题的。您有一个清晰的路径作为要聚合的键,无需将其转换为数组:
cursor = db.sample.aggregate([
{ "$group": {
"_id": "$b.d",
"count": { "$sum": 1 }
}},
{ "$group": {
"_id": None,
"data": { "$push": { "k": "$_id", "v": "$count" } }
}},
{ "$replaceRoot": {
"newRoot": { "$arrayToObject": "$data" }
}}
])
for doc in cursor:
print(doc)
返回
{ 'x': 1, 'xx': 2, 'xxx': 1 }
但这实际上是矫枉过正,因为实际上所有工作都是在最初的 $group
中完成的。陈述。您真正需要做的就是运行它并获取结果并将它们组合到一个字典中作为所需的输出:
cursor = db.sample.aggregate([
{ "$group": {
"_id": "$b.d",
"count": { "$sum": 1 }
}}
])
data = list(cursor)
result = reduce(
lambda x,y:
dict(x.items() + { y['_id']: y['count'] }.items()), data,{})
print(result)
它返回完全相同的东西:
{ 'x': 1, 'xx': 2, 'xxx': 1 }
此外,它不需要添加其他聚合阶段和运算符所需的体操,并且自初始 $group
以来,您没有更改服务器真正返回的内容。响应基本上是:
{ "_id" : "xxx", "count" : 1 }
{ "_id" : "xx", "count" : 2 }
{ "_id" : "x", "count" : 1 }
因此,这里真正的教训是,虽然您可以在聚合管道中进行花哨的操作,但您真正应该考虑的是,当替代方案更干净时,您可能不应该以及更具可读性的代码。
仅供引用,尽管发生的只是附加的 $group
使用$push
创建一个带有 k
和 v
键的数组,正如下一个管道阶段所期望的那样。下一阶段使用 $replaceRoot
获取 $arrayToObject
的输出来自前一阶段创建的数组,基本上将其转换为对象/字典。
相比之下,reduce
正在做完全相同的事情。我们基本上将光标结果放入一个列表中,以便 python 函数可以对该列表进行操作。然后,只需遍历该列表中的文档即可,该列表始终以 _id
作为键,并使用另一个命名属性作为“计数”输出(这里我们使用 count
)并且只需将它们转换为最终字典输出的键和值对。
只是为了好玩,基于您最初尝试的一些内容可能是:
db.sample.aggregate([
{ "$addFields": { "b": { "$objectToArray": "$b" } } },
{ "$unwind": "$b" },
{ "$group": {
"_id": {
"_id": "$b.k",
"k": "$b.v"
},
"count": { "$sum": 1 }
}},
{ "$group": {
"_id": "$_id._id",
"data": { "$push": { "k": { "$toString": "$_id.k" }, "v": "$count" } }
}},
{ "$addFields": {
"data": { "$arrayToObject": "$data" }
}}
])
这将返回:
{ "_id" : "c", "data" : { "25" : 3, "5" : 1 } }
{ "_id" : "e", "data" : { "36" : 4 } }
{ "_id" : "d", "data" : { "xxx" : 1, "xx" : 2, "x" : 1 } }
同样,在没有额外的管道阶段进行转换的情况下,通过使用 python 的 map
和 reduce
可以获得相同的结果:
cursor = db.sample.aggregate([
{ "$addFields": { "b": { "$objectToArray": "$b" } } },
{ "$unwind": "$b" },
{ "$group": {
"_id": {
"_id": "$b.k",
"k": "$b.v"
},
"count": { "$sum": 1 }
}},
{ "$group": {
"_id": "$_id._id",
"data": { "$push": { "k": "$_id.k", "v": "$count" } }
}}
])
data = list(cursor)
result = map(lambda d: {
'_id': d['_id'],
'data': reduce(lambda x,y:
dict(x.items() + { y['k']: y['v'] }.items()), d['data'],
{})
},data)
关于python - 计算嵌套字段的所有唯一值的频率计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55321910/
我在leetcode上看到这段代码,是一道求众数的题,下面是题目描述: 给定一个大小为 n 的数组,找到多数元素。众数元素是出现次数超过 ⌊ n/2 ⌋ 次的元素。 你可以假设数组是非空的并且多数元素
每次在 JavaScript 中执行特定操作时,例如: $(function() { $('#typing').keyup(function () { switch($(this)
我一直在为网页设计一个计数器,但我一直被这个我无法解决的功能所困扰。 我有一个 4 个 div 的计数器,因为其中两个是小数字,另外两个是大数字,所以第一个运行得很快,我看不到它们的功能。 有人知道如
我已经在文档中进行了一些搜索,并在网上花了一段时间,但找不到解决方案!我希望警报告诉我单击 .thumb 时它处于each() 的哪一次迭代。 EG:有六个.thumb,我点击数字3,浏览器弹出3!
在 Handlebars 中,假设我有 names 的集合.我能怎么做 {{#each names}} {{position}} {{name}} {{/each}} 在哪里 {{position}}
这个问题在这里已经有了答案: Numbering rows within groups in a data frame (9 个回答) 4年前关闭。 我们如何在数据帧的每组中生成唯一的 ID 号?以下
我正在努力解决以下问题。我希望为给定的“一”序列创建一个计数器。例如,我有以下内容: 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 鉴于该序列,我希望为 1 的每个序列设置一个计数器直到
我正在努力解决以下问题。我希望为给定的“一”序列创建一个计数器。例如,我有以下内容: 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 鉴于该序列,我希望为 1 的每个序列设置一个计数器直到
我有一个jsfiddle here 这是一个简单的 JavaScript 函数,可以计算出设定的数字。 是否可以进行这种计数,但也保留一位小数 所以它算 1.1、1.2、1.3 等。 func
我正在构建一个计数器,当我按下鼠标时,它应该增加到 maxValue 并且减少不超过 0。我还可以选择将计数器重置为其初始值:0。另外,如果 maxValue 是偶数,它应该计数到该数字。但是,如果
所以我成功地为字母和单词构建了其他计数器,但现在我只能用这个来计算句子。我的代码如下,当我运行它时,它会返回很多错误消息: #include #include #include int main
Closed. This question is off-topic。它当前不接受答案。
我需要一个计数器,它会随着某些任务的完成而递增。我们只需要最后一小时的值,即窗口将移动而不是静态时间。 解决此问题的最佳方法是什么?我能想到的一种方法是拥有一个大小为 60 的数组,每分钟一个,并更新
我希望使用计数器来为我提供独特的引用系统。我想单击一个按钮,然后检查一个字段/文件中的最后一个数字,然后简单地向其添加 1,然后将其插入到屏幕上的字段中? 不确定执行此操作的最佳方法或具体如何执行此操
我有一个用 php 制作的表格,在该表格内我显示了数据库中的一些内容。我在每个 td 中创建了一个简单的按钮(类似于 Like),我希望每次点击它都会增加 1。这是带有按钮的行: echo "
如何将数据库中的值转换为可用于 if else 函数的 int 值? 例如:在我的数据库“armnumber = 3”中,如何在 if else 函数中使用它? 代码 string myConnect
我需要生成唯一的“ids”,问题是,它只能在 1 - 99999 之间。 “好”的是,它仅在与另一列组合时必须是唯一的。 我们有组,每个组都有自己的“group_id”,每个组都需要类似 unique
有这个简单的代码: UPDATE counter SET c= c +1 where id = 1; 并且它在开头的 c 字段中为 null 的情况下不起作用。它只有在已经输入了一些数字时才有效,也就
我正在尝试在 python 中构建一个具有闭包属性的计数器。以下工作中的代码: def generate_counter(): CNT = [0] def add_one():
我使用 CSS 来计算 HTML 文档中的部分: body {counter-reset: sect;} section:before { counter-increment: sect;
我是一名优秀的程序员,十分优秀!