有效更新MongoDB / pymongo中的记录(可能是就地?)

时间:2013-02-26 16:13:29

标签: mongodb pymongo mongodb-update

我正在更新我的收藏中的记录:

for document in myDB.find():
    if compliesToSomeRule(document):
        myDB.update({'_id':document['_id']}, {'$set':{'something':'somevalue'}})

这是最有效的方法吗?

由于重新查询索引,我必须将更新的第一个参数设置为文档的_id,这似乎很奇怪?

有没有办法更新“就地”可以这么说?

4 个答案:

答案 0 :(得分:1)

您所做的更新命令的第一部分基本上是您所需的“compliesToSomeRule”方法。例如,假设compliesToSomeRule定义如下:

def compliesToSomeResult(doc):
    if doc['a'] == 0:
        return True
    else:
        return False

然后你可以跳过这个集合而只是做

myDB.update({ 'a' : 0 }, {'$set' : { 'x' : 'y' }})

然后,您将更新文档(第二个)应用于集合中字段等于0的所有文档。

另一个例子:如果你想找到'a'>所有的文件0你可以做到

myDB.update({ 'a' : { '$gt' : 0 }}, {'$set' : {'x' : 'y'}})

更新调用的第一部分“查询”部分是指定接收更新的文档的方式。第二部分定义了实际更新的内容。

以下是您在查看此资料时可能会发现有用的文档:http://docs.mongodb.org/manual/applications/update/

答案 1 :(得分:0)

您正在更新。更新的第一个参数是一个find子句,它就是如何识别要更新的记录。

修改

  

MongoDB是否处理缓存?   是。 MongoDB保持最佳状态   最近在RAM中使用的数据。如果您已为自己创建了索引   查询和您的工作数据集适合RAM,MongoDB服务于所有   来自记忆的查询。

     

MongoDB没有实现查询缓存:MongoDB提供所有查询   直接来自索引和/或数据文件。


此外,您的用户名很棒:)

答案 2 :(得分:0)

我想你想看一下“$ where”关键字。 http://docs.mongodb.org/manual/reference/operator/where/它允许您基于javascript函数进行查询,因此一切都在数据库上进行。这可能会慢一些。

答案 3 :(得分:-1)

如果您需要查找特定文档然后添加内容:

    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"}})