Python pymongo-upsert无法使用$set操作执行插入
我有一个空集合,需要处理数千个条目(条目可能有冗余,我希望使用更新和插入)。 我编写的python代码(使用pymongo): 以下代码无法执行任何插入操作。收藏仍然是空的。但当我删除$set并使用简单的数据时,它工作得很好。我不能在upsert中使用$set吗?我希望设置$set的原因是为了不影响BSON的现有字段。有人能给我引路吗。我真的不知道该怎么办 可复制代码:Python pymongo-upsert无法使用$set操作执行插入,python,mongodb,pymongo,upsert,Python,Mongodb,Pymongo,Upsert,我有一个空集合,需要处理数千个条目(条目可能有冗余,我希望使用更新和插入)。 我编写的python代码(使用pymongo): 以下代码无法执行任何插入操作。收藏仍然是空的。但当我删除$set并使用简单的数据时,它工作得很好。我不能在upsert中使用$set吗?我希望设置$set的原因是为了不影响BSON的现有字段。有人能给我引路吗。我真的不知道该怎么办 可复制代码: from pymongo import Connection DB_CONTENT_BASE_KEY = 'contentba
from pymongo import Connection
DB_CONTENT_BASE_KEY = 'contentbase'
def connect_to_db(dbname, hostname = 'localhost', portno = 27017, **kwargs):
connection = Connection(hostname, portno)
dbConnection = connection[dbname]
return dbConnection
class MetawebCustomCollectionBuilder(object):
# key ought to be a dictionary to filter results from contentbase.
def __init__(self, inDbConfig, outDbConfig, key = {}, verbose = False):
self.verbose = verbose
self.inDbConfig = inDbConfig
self.inDb = connect_to_db(**inDbConfig)
self.outDbConfig = outDbConfig
self.outDb = connect_to_db(**outDbConfig)
self.inDbContentBase = self.inDb[self.inDbConfig[DB_CONTENT_BASE_KEY]]
self.outDbContentBase = self.outDb[self.outDbConfig[DB_CONTENT_BASE_KEY]]
self.key = key
self.in_db_collection_constraints()
self.out_db_collection_constraints()
def in_db_collection_constraints(self):
self.inDbContentBase.ensure_index('mid')
if self.verbose: print("Assured index on mid for inDbContentBase...")
def out_db_collection_constraints(self):
self.outDbContentBase.ensure_index('mid')
if self.verbose: print("Assured index on mid for outDbContentBase...")
def process_in_record(self, inRecord):
outRecord = inRecord # [YET TO] continue from here...
return outRecord
def transit_collection(self):
for record in self.inDbContentBase.find(self.key):
outRecord = self.process_in_record(record)
key = {'mid':outRecord['mid']}
data = outRecord
print key
self.outDbContentBase.update(key, {"$set": data}, True)
if self.verbose: print 'Done with transiting collection from in DB to out DB'
def cleanup_out_collection(self):
pass
def in_db_sandbox(self):
# To have tests and analytics placed in here corresponding to inDb.
pass
if __name__ == '__main__':
inDbConfig = {'dbname':'metaweb', 'contentbase': 'content'}
outDbConfig = {'dbname': 'similarkind', 'contentbase': 'content'}
mccb = MetawebCustomCollectionBuilder(inDbConfig, outDbConfig, verbose = True)
mccb.transit_collection()
必须有一个预先存在的数据库inDb。我想从这个集合中创建一个新的修改集合。您的声明是错误的
你的要求是错误的
提供一个可复制的代码示例。您是指能够执行插入的代码。提供一个代码示例,我们可以复制/粘贴并自己尝试…我们没有义务调整您的代码以获得我们可以尝试的代码示例…这是您的任务,而不是我们的任务。我在问题本身中给出了可复制的代码。:)检查transit_collection()方法。提供一个可复制的代码示例。您是指能够执行插入的代码。提供一个我们可以复制/粘贴并自己尝试的代码示例…我们没有义务调整您的代码以获得我们可以尝试的代码示例…这是您的任务,不是我们的。我在问题本身中给出了可复制的代码。:)检查transit_collection()方法。但在我的实际代码中,它不起作用。不管怎样,谢谢你的时间和帮助,我会设法解决的。然后你做了一些不同于你解释的事情。如前所述:你关于update()的声明是错误的。此外:enable safe=true我遇到了问题。使用$set时,数据必须从中弹出ObjectId。它现在可以工作了:)但在我的实际代码中它不工作。不管怎样,谢谢你的时间和帮助,我会设法解决的。然后你做了一些不同于你解释的事情。如前所述:你关于update()的声明是错误的。此外:enable safe=true我遇到了问题。使用$set时,数据必须从中弹出ObjectId。现在可以工作了:)
from pymongo import Connection
DB_CONTENT_BASE_KEY = 'contentbase'
def connect_to_db(dbname, hostname = 'localhost', portno = 27017, **kwargs):
connection = Connection(hostname, portno)
dbConnection = connection[dbname]
return dbConnection
class MetawebCustomCollectionBuilder(object):
# key ought to be a dictionary to filter results from contentbase.
def __init__(self, inDbConfig, outDbConfig, key = {}, verbose = False):
self.verbose = verbose
self.inDbConfig = inDbConfig
self.inDb = connect_to_db(**inDbConfig)
self.outDbConfig = outDbConfig
self.outDb = connect_to_db(**outDbConfig)
self.inDbContentBase = self.inDb[self.inDbConfig[DB_CONTENT_BASE_KEY]]
self.outDbContentBase = self.outDb[self.outDbConfig[DB_CONTENT_BASE_KEY]]
self.key = key
self.in_db_collection_constraints()
self.out_db_collection_constraints()
def in_db_collection_constraints(self):
self.inDbContentBase.ensure_index('mid')
if self.verbose: print("Assured index on mid for inDbContentBase...")
def out_db_collection_constraints(self):
self.outDbContentBase.ensure_index('mid')
if self.verbose: print("Assured index on mid for outDbContentBase...")
def process_in_record(self, inRecord):
outRecord = inRecord # [YET TO] continue from here...
return outRecord
def transit_collection(self):
for record in self.inDbContentBase.find(self.key):
outRecord = self.process_in_record(record)
key = {'mid':outRecord['mid']}
data = outRecord
print key
self.outDbContentBase.update(key, {"$set": data}, True)
if self.verbose: print 'Done with transiting collection from in DB to out DB'
def cleanup_out_collection(self):
pass
def in_db_sandbox(self):
# To have tests and analytics placed in here corresponding to inDb.
pass
if __name__ == '__main__':
inDbConfig = {'dbname':'metaweb', 'contentbase': 'content'}
outDbConfig = {'dbname': 'similarkind', 'contentbase': 'content'}
mccb = MetawebCustomCollectionBuilder(inDbConfig, outDbConfig, verbose = True)
mccb.transit_collection()
>>> import pymongo
>>> c = pymongo.Connection()
>>> db = c.mydb
>>> db.mydocs.find().count()
0
>>> db.mydocs.update({'myid': '438'}, {"$set": {'keyA':'valueA'}}, upsert = True)
>>> db.mydocs.find().count()
1
>>> db.mydocs.find_one()
{u'myid': u'438', u'keyA': u'valueA', u'_id': ObjectId('504c2fd1a694cc9624bbd6a2')}