MongoDB查找集合中所有可能'columns'的计数



有没有办法找到集合中所有可能数量的"columns"或json属性?(我知道把它们称为列是不正确的,但只是为了便于理解(

例如,以下所有文档都在同一个名为"人员"的集合中:

{"Name": "bob", "Profession": "IT", "Height": 200},
{"Name": "simon", "Weight": 100, "IQ": 120},
{"Name": "james", "Weight": 130, "Glasses": "Yes"}

这里可能的"栏"有:姓名、职业、身高、体重、智商和眼镜。一共6个。

有没有什么方法可以让我做一个计数为6的运算?(如果还有pymongo变体,则特别有用(

我想将数据从MongoDB传输到表格式中,了解表的总列数是很有用的。

您可以使用此聚合查询来获得您想要的结果:

这里的技巧是使用$objectToArray来获得作为值的键。然后移除密钥_id(如果存在(并分组以获得总数。

db.collection.aggregate([
{
"$project": {
"keys": {
"$objectToArray": "$$ROOT"
}
}
},
{
"$unwind": "$keys"
},
{
"$match": {
"keys.k": {
"$ne": "_id"
}
}
},
{
"$group": {
"_id": "$keys.k",
"total": {
"$sum": 1
}
}
},
{
"$group": {
"_id": null,
"total": {
"$sum": 1
}
}
}
])

示例

编辑:

避免$unwind和双$groupid此查询的另一种方法:

这个想法和以前一样,使用$objectToArray将密钥作为key.k,然后使用$group将所有值相加到一个数组中
然后得到数组的大小,然后进行一些计算:$reduce使数组变平,$filter不得到_id字段。

注意,如果你想计算_id,你可以简单地删除$filter阶段,就像这个例子

db.collection.aggregate([
{
"$project": {
"keys": {
"$objectToArray": "$$ROOT"
}
}
},
{
"$group": {
"_id": null,
"keys": {
"$addToSet": "$keys.k"
}
}
},
{
"$project": {
"_id": 0,
"keys": {
"$size": {
"$filter": {
"input": {
"$reduce": {
"input": "$keys",
"initialValue": [],
"in": {
"$setUnion": [
"$$value",
"$$this"
]
}
}
},
"cond": {
"$ne": [
"$$this",
"_id"
]
}
}
}
}
}
}
])

示例

相关内容

最新更新