我正在更新我的收藏中的记录,如下所示:
for document in myDB.find():
if compliesToSomeRule(document):
myDB.update({'_id':document['_id']}, {'$set':{'something':'somevalue'}})
这是最有效的方法吗?
我必须将更新的第一个参数设置为_id
文档的参数,这似乎很奇怪,因为那是重新查询索引吗?
可以这么说,有没有办法“就地”更新?
我正在更新我的收藏中的记录,如下所示:
for document in myDB.find():
if compliesToSomeRule(document):
myDB.update({'_id':document['_id']}, {'$set':{'something':'somevalue'}})
这是最有效的方法吗?
我必须将更新的第一个参数设置为_id
文档的参数,这似乎很奇怪,因为那是重新查询索引吗?
可以这么说,有没有办法“就地”更新?
您所做的更新命令的第一部分本质上是您想要的“compliesToSomeRule”方法。例如,假设 compliesToSomeRule 定义如下:
def compliesToSomeResult(doc):
if doc['a'] == 0:
return True
else:
return False
然后你可以跳过这组,然后做
myDB.update({ 'a' : 0 }, {'$set' : { 'x' : 'y' }})
然后,这会将您的更新文档(第二个)应用于集合中字段 a 等于 0 的所有文档。
另一个例子:如果你想找到 'a' > 0 你可以做的所有文件
myDB.update({ 'a' : { '$gt' : 0 }}, {'$set' : {'x' : 'y'}})
更新调用的第一部分,“查询”部分,是您如何指定哪些文档接收更新。第二部分定义了更新的实际内容。
这是一个文档,您在查看此材料时可能会发现它有帮助:http: //docs.mongodb.org/manual/applications/update/
我想你想看看“$where”关键字。 http://docs.mongodb.org/manual/reference/operator/where/ 它允许您基于javascript函数进行查询,因此一切都发生在数据库上。不过这可能会慢一些。
您正在就地更新。update 的第一个参数是 find 子句,这就是它识别要更新的记录的方式。
编辑
MongoDB 是否处理缓存? 是的。MongoDB 将所有最近使用的数据保存在 RAM 中。如果您为查询创建了索引并且您的工作数据集适合 RAM,则 MongoDB 从内存中提供所有查询。
MongoDB 不实现查询缓存:MongoDB 直接从索引和/或数据文件提供所有查询。
另外,你的用户名很棒:)
如果您需要查找特定文档,然后添加一些内容:
flag=db.foo.find({"_id":333})
try:
if flag[0]['_id']:
db.foo.update({"_id":333},{"$set":{"name":"mongo"}})
except:
print "none"
但是如果您需要搜索所有文档并向所有文档添加一些内容:
flag=db.foo.find()
for row in flag:
db.foo.update({"_id":flag['_id']},{"$set":{"name":"mongo"}})