mongodb Pymongo查找和修改

carvr3hs  于 2023-01-04  发布在  Go
关注(0)|答案(4)|浏览(147)

我在一个mongodb集合中有一个find查询,并且希望这个查询也更新一个字段......类似于这样......

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方法,但找不到任何如何使用它的示例...
提前感谢您的帮助!

gzjq41n4

gzjq41n41#

请注意,此答案中的方法已被弃用。有关详细信息,请参阅Sid Holland's answer
请参阅文档,例如

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

find_and_modify,根据文件,Returns 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!'}]
a5g8bdjr

a5g8bdjr2#

对于那些在Google上搜索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)
i2loujxw

i2loujxw3#

由于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,它将返回更新后的文档;如果它被设置为BEFORE,它将返回更新前的文档。

busg9geu

busg9geu4#

使用update_one更新collection中的单个文档,如果条件不匹配,则将upsert设置为True以创建新的document

collection.update_one(
    filter = {"field1" : "value1"},
    update = {"$set" : {"field2" : "value2"}},
    upsert = True
)

相关问题