如何查询具有不同子级别的MongoDB数据库?

时间:2018-07-10 17:07:04

标签: python database mongodb pymongo

我是使用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

我想得到的名字是...任何想法?

谢谢!

1 个答案:

答案 0 :(得分:0)

除了提供的示例结构中未对字段进行复数之外,以下查询看起来还不错。

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

请注意 child字段是单数。

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

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

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

您可以使用来检索名称

  

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

  

rows ['child'] ['first'] ['name']

您可以通过运行返回 document id firstname 代替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")])