【问题标题】:How can I query a MongoDB database with different child levels?如何查询具有不同子级别的 MongoDB 数据库?
【发布时间】:2018-07-10 17:07:03
【问题描述】:

我是使用 pymongo 的 mongoDB 新手。我正在尝试查询一个集合并从一个字段中获取一个特定的孩子。这是我尝试过的:

import pymongo
import csv
from pymongo import MongoClient

connection = MongoClient()
db = connection.database
collection1 = db.data1
collection2 = db.data2
writer = csv.writer(open("Result_example.csv", "w"))
with open('Data_example.csv') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=';')
    for row in spamreader:

        for rows in collection1.find({"_id": row[0]}, { "childs.first.name": 1}):
            writer.writerow([row[0], rows.get("childs.first.name")])

数据库结构是这样的:

child
   first
      name

我想要的是名字...有什么想法吗?

谢谢!!!

【问题讨论】:

    标签: python database mongodb pymongo


    【解决方案1】:

    除了在提供的示例结构中字段没有被复数,以下查询看起来很好。

    for rows in collection1.find({"_id": row[0]}, { "child.first.name": 1}):
    

    请注意 child 字段是单数的。

    rows 是对字典对象的引用,如下所示:

    {
        'child': {
            'first': {
                'name': 'Vorname'
            }
        }
    }
    

    rows.get("childs.first.name")writer.writerow([row[0], rows.get("childs.first.name")]) 中返回None

    您可以使用检索名称

    rows.get('child').get('first').get('name')

    或者

    行['child']['first']['name']

    您可以通过运行返回 文档 idfirstname 代替 collection1.find({"_id": row[0]}, { "child.first.name": 1}) 的聚合来保存这些嵌套的键访问。

    children_names = db.collection1.aggregate([
        {
            '$match': {'_id': ObjectId(row[0])}
        },
        {
            '$replaceRoot': {'newRoot': {'_id': '$_id', 'first_name': '$child.first.name' }}
        },
    
    ])
    

    然后可以进行一次密钥访问。

    for rows in children_names:
        writer.writerow([row[0], rows.get("first_name")])
    

    【讨论】:

      猜你喜欢
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 2013-01-01
      • 2011-07-12
      • 2019-02-02
      • 2022-01-16
      • 1970-01-01
      相关资源
      最近更新 更多