Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pymongo从集合中获取Mongo字段名_Python_Json_Python 3.x_Mongodb_Pymongo - Fatal编程技术网

Python 使用pymongo从集合中获取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

我正在尝试使用pymongo从MongoDB获取字段名。有办法吗

Mongo收集格式:

    "_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,是的,这就是我想要的