Mongo DB,Python:每10000条记录Upsert。

时间:2017-05-04 02:22:01

标签: python mongodb

我必须在MongoDB中记录这些记录。我使用了一个简单的逻辑,但它没有用。请帮我解决这个问题。

from pymongo import MongoClient
import json
import sys
import os
client = MongoClient('localhost', 9000)
db1 = client['Com_Crawl']
collection1 = db1['All']
posts1 = collection1.posts
ll=[]
f=file(sys.argv[1],'r')
for i in f:
    j=json.loads(i)
    ll.append(j)
#print ll
print len(ll)
count = 0
for l in ll:
    count = count+1
    if count <= 10000:
        print count,l
        print posts1.update({'vtid':l},{'$set': {'processed': 0}},upsert = True,multi = True)
print "**** Success ***"

该文件包含1000万条记录。上面的代码插入了一个新列,并将其值更新为“0”以存储10000条记录。但是如何在每次执行的10000批次中记录其余记录。

2 个答案:

答案 0 :(得分:1)

你可以这样做。

for l in ll:
    for post in posts1.find({}).skip(count*10000).limit(10000):
        print post.update({'vtid':l},{'$set': {'processed': 0}},upsert = True,multi = True)
    count += 1
print "**** Success ***"

skip()完全符合您的想法,它会跳过查询集中的许多条目,然后limit()将结果限制为10000.所以基本上您正在使用{{1获取以0,10000,20000等开头的条目,并限制在该起点后仅获得10000。

答案 1 :(得分:0)

Mongodb具有批量更新操作,可以批量更新数据库。你可以添加任何一个dict并且可以一次更新,但它在批量refer this内部更新1000 x 1000以了解有序和无序批量操作,refer this以了解批量更新refer this以了解批量操作的工作原理。因此,如果您关注批量更新,那么

from pymongo import MongoClient
client = MongoClient('localhost', 9000)
db1 = client['Com_Crawl']
collection1 = db1['All']
posts1 = collection1.posts
bulk = collection1.posts.initialize_unordered_bulk_op()
ll=[]
f=file(sys.argv[1],'r')
for i in f:
    j=json.loads(i)
    ll.append(j)
#print ll
print len(ll)
count = 0
for index,l in enumerate(ll):
   bulk.find({'vtid':l}).update({'$set': {'processed': 0}},upsert = True,multi = True)
    if (index+1)%10000 == 0:
        bulk.execute() #this updates the records and prints the status.
        bulk = collection1.posts.initialize_unordered_bulk_op() #reinitialise for next set of operations.
bulk.execute() #this updates the remaining last records.

Joe D 所指出,您也可以跳过记录并批量更新。