首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB $pull效率

MongoDB $pull效率
EN

Stack Overflow用户
提问于 2016-01-16 10:34:29
回答 1查看 349关注 0票数 2

让我们假设以下模式

代码语言:javascript
复制
var schema = new mongoose.Schema({
    data: { type: [Number] }
});
schema.index({ _id: 1, data: 1 });
var model = mongoose.model('Test', schema);

$pull运算符从doc.data中删除条目的效率有多高?

代码语言:javascript
复制
model.update({ _id: someId }, { $pull: { data: { $lte: 123 } } }).exec();

它是否使用索引并在O(log + m)复杂性中运行,其中n是数据中的元素数,m是删除的元素数?还是必须扫描整个阵列?

蒙戈发现元素后移除元素的复杂性有多大?是O(1),O(log n)还是O(n),因为它必须移动其他项目?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-16 15:45:19

集合的索引仅用于查找更新的一部分的文档,而不是更新本身。

因此,_id上的内置索引将用于查找文档,但$pull更新将要求对{$lte: 123}查询: O(n)读取和扫描整个data数组。

您在{ _id: 1, data: 1 }上添加的索引只有在实际查询中还包括data时才会使用,如下所示:

代码语言:javascript
复制
model.update({_id: someId, data: {$lte: 123}}, {$pull: {data: {$lte: 123}}}).exec();

但是,这只会在data不包含值为<= 123的元素的情况下通过短路更新来提供好处,因为文档不再符合标准。它仍然不会用于查找data本身的$pull元素。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34825941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档