使用pymongo将JSON模板从文件插入mongodb

时间:2018-02-07 11:10:07

标签: python mongodb pymongo

我在文本中有一个嵌套json的模板。

模板看起来像

Yii::$app->user->identity->customer->id

我希望,条件是将模板读入python变量,然后根据需要更改一些字段(即$ cat file.txt { "sensor" : { "type": "unknown", "notifications": "off" "timeout": "0" "featureset": { "features": [ { "name": "Temp", "enabled": "No", }, { "name": "Humidity", "enabled": "No", } ] } } } )。然后将其保存到mongodb数据库中。

我的代码如下:

"notifications": "on"

这不起作用。我得到dbclient = MongoClient() db = dbclient.sensors def main(): with open ("file.txt", 'r') as template: data = template.read() print ('data: %s' % data) dbdata = db.testdata post_id = dbdata.insert_one(bson.BSON.encode(data.strip("\r\n"))) print ('Inserted post id %s ' % post_id) if __name__ == "__main__": main()

如何将从文本文件中读取的此字符串转换为适合mongodb的格式?

谢谢

1 个答案:

答案 0 :(得分:0)

更新文件有效的JSON数据。这意味着JSON数组中的最后一项或JSON对象中的最后一对没有终端逗号。

{
    "sensor": {
        "type": "unknown",
        "notifications": "off",
        "timeout": "0",
        "featureset": {
            "features": [
                {
                    "name": "Temp",
                    "enabled": "No"
                },
                {
                    "name": "Humidity",
                    "enabled": "No"
                }
            ]
        }
    }
}

接下来请注意有关BSON.encodepymongo.collection.Collection.insert_one

的文档中的以下信息

bson.BSON.encode必须在其他参数中传递document。 文档可以是任何映射类型(例如:class:dict)。

pymongo.collection.Collection.insert_one应该传递dictbson.son.SONbson.raw_bson.RawBSONDocument的实例或继承自collections.MutableMapping的类型。

知道可以传递一个可变映射,我们可以将我们的JSON模板反序列化为它的Python表示并直接插入。

from pymongo import MongoClient
import json

dbclient = MongoClient()
db = dbclient.sensors

def main():
    with open('fakedata/sensor.json') as template:
        template_dct = json.load(template)

    result = db.test.insert_one(template_dct)
    print('Inserted post id %s ' % result.inserted_id)

if __name__ == "__main__":
    main()