Pymongo找到并修改

时间:2014-04-29 15:10:27

标签: python mongodb pymongo

我在mongodb集合中有一个查找查询,并希望此查询也更新一个字段......就像这样......

db = pymongo.MongoClient(DB_HOST)[COLLECTION][Product]
new_posts = db.find({'type':{'$ne':'overview'}, 'indice':0, 'thread_id':{'$nin':front_db_ids}, 'updated':{'$exists':False}},{'_id': 0}) + {{'$set': {'updated':'yes'}}, multi=True

我找到了findandmodify方法,但找不到任何如何使用它的例子......

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:11)

参考documentation, 例如

db.update({"_id": acs_num}, {"$set": mydata}, upsert = True)

find_and_modify根据docsReturns either the object before or after modification based on new parameter. If no objects match the query and upsert is false, returns None. If upserting and new is false, returns {}


例如:

In [1]: from pymongo import MongoClient

In [2]: client = MongoClient("mongodb://localhost:27017")
   ...: db = client["testdb"]
   ...: mycollection = db["mydb"]
   ...: 

In [3]: import datetime
   ...: post1 = {"author": "Mike", "text": "My first blog post!", "tags": ["mongodb", "python", "pymongo"], "date": datetime.datetime.utcnow()}
   ...: 

In [4]: mycollection.insert(post1)
Out[4]: ObjectId('535fd580c314f91d28c35ee1')

In [5]: [x for x in mycollection.find()]
Out[5]: 
[{u'_id': ObjectId('535fd580c314f91d28c35ee1'),
  u'author': u'Mike',
  u'date': datetime.datetime(2014, 4, 29, 16, 38, 15, 457000),
  u'tags': [u'mongodb', u'python', u'pymongo'],
  u'text': u'My first blog post!'}]

In [6]: mycollection.find_and_modify(query={'author':'Mike'}, update={"$set": {'author': "Mike2"}}, upsert=False, full_response= True)
Out[6]: 
{u'lastErrorObject': {u'n': 1, u'updatedExisting': True},
 u'ok': 1.0,
 u'value': {u'_id': ObjectId('535fd580c314f91d28c35ee1'),
  u'author': u'Mike',
  u'date': datetime.datetime(2014, 4, 29, 16, 38, 15, 457000),
  u'tags': [u'mongodb', u'python', u'pymongo'],
  u'text': u'My first blog post!'}}

In [7]: [ x for x in mycollection.find()]
Out[7]: 
[{u'_id': ObjectId('535fd580c314f91d28c35ee1'),
  u'author': u'Mike2',
  u'date': datetime.datetime(2014, 4, 29, 16, 38, 15, 457000),
  u'tags': [u'mongodb', u'python', u'pymongo'],
  u'text': u'My first blog post!'}]

答案 1 :(得分:2)

对于谷歌搜索find_and_modify之后到这里并发现它已被弃用的人(我认为是PyMongo 3.0版),替换为find_one_and_update

假设您有一个名为counters的集合,并且想增加一个计数器:

db.counters.find_one_and_update({"_id": "counter-id"}, {"$inc":{"sequence_value":1}})

如果要返回新文档,而不是原始的预先更新文档,则传递的参数为new,而不是大多数文档所述的returnNewDocument

db.counters.find_one_and_update({"_id": "counter-id"}, {"$inc":{"sequence_value":1}}, new=True)

答案 2 :(得分:1)

由于不建议使用find_and_modify,而请使用find_one_and_update方法,请使用find_one_and_update方法的return_document参数返回更新的文档或未更新的文档。

update_object = collection_object.find_one_and_update({'_id': ObjectId(pk)}, {'$set': data}, return_document=ReturnDocument.AFTER)

此处,return_document设置为ReturnDocument.AFTER,它将在更新文档后返回该文档。如果将其设置为“之前”,它将在更新文档之前返回该文档。