让我们假设以下模式
var schema = new mongoose.Schema({
data: { type: [Number] }
});
schema.index({ _id: 1, data: 1 });
var model = mongoose.model('Test', schema);$pull运算符从doc.data中删除条目的效率有多高?
model.update({ _id: someId }, { $pull: { data: { $lte: 123 } } }).exec();它是否使用索引并在O(log + m)复杂性中运行,其中n是数据中的元素数,m是删除的元素数?还是必须扫描整个阵列?
蒙戈发现元素后移除元素的复杂性有多大?是O(1),O(log n)还是O(n),因为它必须移动其他项目?
发布于 2016-01-16 15:45:19
集合的索引仅用于查找更新的一部分的文档,而不是更新本身。
因此,_id上的内置索引将用于查找文档,但$pull更新将要求对{$lte: 123}查询: O(n)读取和扫描整个data数组。
您在{ _id: 1, data: 1 }上添加的索引只有在实际查询中还包括data时才会使用,如下所示:
model.update({_id: someId, data: {$lte: 123}}, {$pull: {data: {$lte: 123}}}).exec();但是,这只会在data不包含值为<= 123的元素的情况下通过短路更新来提供好处,因为文档不再符合标准。它仍然不会用于查找data本身的$pull元素。
https://stackoverflow.com/questions/34825941
复制相似问题