Python 使用pymongo从集合中获取Mongo字段名
我正在尝试使用pymongo从MongoDB获取字段名。有办法吗 Mongo收集格式:Python 使用pymongo从集合中获取Mongo字段名,python,json,python-3.x,mongodb,pymongo,Python,Json,Python 3.x,Mongodb,Pymongo,我正在尝试使用pymongo从MongoDB获取字段名。有办法吗 Mongo收集格式: "_id" : ObjectId("5e7a773721ee63712e9d25a3"), "effective_date" : "2020-03-24", "data" : [ { "Year" : 2020, "month" : 1, "Day" : 28, "views
"_id" : ObjectId("5e7a773721ee63712e9d25a3"),
"effective_date" : "2020-03-24",
"data" : [
{
"Year" : 2020,
"month" : 1,
"Day" : 28,
"views" : 4994,
"clicks" : 3982
},
{
"Year" : 2020,
"month" : 1,
"Day" : 17,
"views" : 1987,
"clicks" : 3561
},
.
.
.
]
是否有办法获取字段名:
我想获取:\u id,生效日期,data.Year,data.month,data.Day,data.views,data.clicks
这就是我所拥有的:
from datetime import datetime, timedelta, date
import pymongo
from pymongo import MongoClient
from pymongo.read_preferences import ReadPreference
from pprint import pprint
from bson.son import SON
from bson import json_util
from bson.json_util import dumps, loads
import re
client = pymongo.MongoClient(host='mongodb://00.00.00.0:00000')
db = client.collection
pprint(db)
def get_results(filters):
col=db.results
res = col.find()
res = list(res)
return dumps(res, indent=4)
有没有一种方法可以让我使用pymongo只获取字段名?在本例中,我们并不是真的进行过滤或聚合;我们正在做一个大的
find()
,然后我们需要所有的字段名。也没有投影。因此,假设我们无论如何都要拖拽所有数据,让客户端来完成这项工作。以下内容将捕获唯一的字段名,包括通过数组,并为您提供每个唯一字段名的计数:
r = [
{"_id":0, "A":"A", "data":[
{"Y":2020,"day":3,"clicks":12},
{"Y":2020,"day":4,"clicks":192}
]} ,
{"_id":1, "B":{"foo":"bar"}, "data":[
{"Y":2020,"day":3,"clicks":888,"corn":"dog"},
{"Y":2020,"day":4,"clicks":999,"zing":"zap"}
]} ,
{"_id":2, "B":{"foo":"bit"} },
{"_id":3, "B":{"fin":"bar"} }
]
coll.insert(r)
fieldNames = {}
def addFldName(s):
if s not in fieldNames:
fieldNames[s] = 0
fieldNames[s] += 1
def process(path, v):
addFldName(path)
if("dict" == v.__class__.__name__):
walkMap(path, v)
elif("list" == v.__class__.__name__):
walkList(path, v)
def walkMap(path, doc):
dot = "" if path is "" else "."
for k, v in doc.iteritems():
s = path + dot + k
process(s, v)
def walkList(path, array):
dot = "" if path is "" else "."
for n in range(0,len(array)):
s = path + dot + str(n)
process(s, array[n])
for doc in coll.find():
walkMap("", doc)
print(fieldNames)
{u'A': 1, u'data.1.clicks': 2, u'B': 3, u'data.0': 2, u'data.1': 2, u'data.0.Y': 2, u'data.1.zing': 1, u'data.0.day': 2, u'B.fin': 1, u'B.foo': 2, u'data.1.Y': 2, u'_id': 4, u'data': 2, u'data.0.corn': 1, u'data.0.clicks': 2, u'data.1.day': 2}
这有点奇怪,但是是的,
data.0.clicks
是唯一的,并显示在两个文档中。Vanilla Mongodb没有集合模式-因此,仅在单个文档的上下文中列出字段才有意义。其他文档可能有额外的字段,或者可能缺少一些字段。字段的最佳来源是首先填充DB的应用程序。这是否回答了您的问题?使用MongoDB可以做的最大值是大多数答案给出的,但如果您需要子文档中的密钥,则需要在代码中执行。@whoami,这不是因为这只提供了MapReduce的解决方案。这是一种方法,但您到底想要什么?显示的所有字段的唯一列表没有任何特定文档的属性?@BuzzMoschetti,是的,这就是我想要的