我是pymongo和mongodb的新手。我试图用pymongo交互式插入文档。当我通过python脚本尝试文档时,它失败了。
输入名称: TEST3
输入地址:Someaddress
输入电话号码:9876543
{"Name": "test3", "Phone": 9876543, "Address": "Someaddress"} # Here I am printing the document to be inserted
Traceback (most recent call last):
File "./sample.py", line 54, in <module>
insertDocument()
File "./sample.py", line 27, in insertDocument
insert_id=db.collection.insert_one(obj)
File "/appl/swinstall/mongo-python-driver-master/pymongo/collection.py", line 676, in insert_one
common.validate_is_document_type("document", document)
File "/appl/swinstall/mongo-python-driver-master/pymongo/common.py", line 434, in validate_is_document_type
"collections.MutableMapping" % (option,))
TypeError: document must be an instance of dict, bson.son.SON, bson.raw_bson.RawBSONDocument, or a type that inherits from collections.MutableMapping
以下是我的代码:
#!/usr/bin/python
import sys
import os
from pymongo import MongoClient
ch=MongoClient()
db=ch.local
def insertDocument():
print "insertDocument"
print "Enter the name:"
name=raw_input(">> ")
print "Enter the address"
address=raw_input(">> ")
print "Enter the phone number"
phone=raw_input(">> ")
obj='{"Name": "'+ str(name) +'", "Phone": '+ str(phone) +', "Address": "'+ str(address) +'"}'
print obj
insert_id=db.collection.insert_one(obj)
insertDocument()
但是当我在python终端中尝试相同时,它就会被插入。
test={"Name":"Test3", "Phone":98765653, "Address":"SomeAddress"}
insert_id=db.collection.insert_one(test)
x=db.collection.find()
x.count()
5
for y in x:
... print y
...
{u'Phone': 123456, u'_id': ObjectId('5ac59b23788b851887bb4a77'), u'Name': u'test', u'Address': u'DHL'}
{u'Phone': 5678990, u'_id': ObjectId('5ac5be03788b851c9f7da382'), u'Name': u'test2', u'Address': u'Cyberjaya'}
{u'Phone': 7872476, u'_id': ObjectId('5ac5be3b788b851c9f7da383'), u'Name': u'test3', u'Address': u'Kuala Lumpur'}
{u'Phone': 8977101750L, u'_id': ObjectId('5ac5dc59788b8523141b43eb'), u'Name': u'Soumya', u'Address': u'Cybersquare'}
{u'Phone': 98765653, u'_id': ObjectId('5acace4a788b855f05c7ea0d'), u'Name': u'Test3', u'Address': u'SomeAddress'} <== This got inserted
有人可以帮忙吗?
答案 0 :(得分:0)
通过以下方式更改代码:
insert_id=db.collection.insert_one(json.loads(obj))
答案 1 :(得分:0)
该错误消息给出了提示。它说obj必须是字典。实际上,您在交互式方法中定义了一个dict,但是在脚本中您正在创建一个字符串。字符串看起来像字典,但不是。
您可以通过打印来确认:
打印(type(obj))
因此,解决方案是将其与键值对一起存储在字典中。像这样:
obj = {}
obj [“ name”] = str(name)
等...