2011-08-09 38 views
1

我有一些代码需要在我的mongoDB数据库中更新记录。所以我首先找到记录,然后我更新记录。但是,这些记录有很多与它们一起存储的文本数据,所以我不想在返回时检索整个文档;只是为了让我可以更新它。我认为,如果我在mongoid中使用“only(...)”方法,那只会返回该属性。尽管这些查询似乎运行得非常缓慢,但我不确定他们是否完成了我认为他们正在完成的任务。MongoDB/mongoid update_attributes方法慢吗?

d = Document.only(:title).find(title) # using 'title' as key in mongoDB 
d.update_attributes({ author: "author_name" }) 

是否有更快的方式来执行这个所需的查询?

回答

0

MongoDB提供了许多高度优化的修改器操作。查看使用$set操作只设置一个密钥,而不必处理文档的其余部分。您也可以在单个操作中执行更新和查询。一个土生土长的MongoDB的查询与指定title更新的所有记录author是这样的:

var title = "The Title" 
db.documents.update({ title: title }, { $set: { author: "The Author" } }) 

希望你能找到一种方法,通过Mongoid沿传递查询。如果没有,您可以直接到本地Mongo适配器运行它。欲了解更多信息,请参阅docs on modifier operations

+0

在答案上添加'Document.where(title:title).update_all(作者:“作者”)''。但是这会跳过验证。 – rubish

+0

这与jacobra目前所做的功能相当。它是'$ set'运算符,它允许更新记录的一部分而不用提取整个事物。 – Emily

+0

这个查询不需要提取文档就可以转换为'$ set'。只是一个更好的语法:) – rubish

0

我的一个想法是,你可以将集合分成两个集合:一个具有文本元素(名称,作者,yearPublished,numPages等),另一个具有外键(可以只是MongoDB的_id)和文本本身。然后,您可以在较小的集合上修改像作者姓名这样的东西,我相信这样会更快地执行...我想,有些东西需要测试。不过,我认为你的速度问题是由于记录的大小。我个人注意到,从没有很多属性的简单测试数据集到每个记录具有许多属性的真实数据集,性能出现重大损失。

相关问题