使用pymongo从集合中获取Mongo字段名

2024-05-29 04:57:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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
        },
        .
        .
        .
       ]

是否有办法获取字段名: 我想得到:_id, effective_date, 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获取字段名


Tags: fromimportdbdatadateresyearviews
1条回答
网友
1楼 · 发布于 2024-05-29 04:57:05

在这个例子中,我们并不是真正的过滤或聚合;我们正在做一个大的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是唯一的,并显示在2个文档中

相关问题 更多 >

    热门问题