0

我正在更新我的收藏中的记录,如下所示:

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

这是最有效的方法吗?

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

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

4

4 回答 4

1

您所做的更新命令的第一部分本质上是您想要的“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/

于 2013-02-26T22:55:58.317 回答
0

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

于 2013-02-26T23:08:05.960 回答
0

您正在就地更新。update 的第一个参数是 find 子句,这就是它识别要更新的记录的方式。

编辑

MongoDB 是否处理缓存? 是的。MongoDB 将所有最近使用的数据保存在 RAM 中。如果您为查询创建了索引并且您的工作数据集适合 RAM,则 MongoDB 从内存中提供所有查询。

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


另外,你的用户名很棒:)

于 2013-02-26T16:17:07.457 回答
-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"}})
于 2013-05-08T20:28:32.137 回答