2016-01-16 3 views
1

Предположим, следуя схеме

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 (журнал N + M) сложность, где п число элементов в данных и т число удаленных элементов? Или он должен сканировать весь массив?

И какова сложность удаления элемента после того, как Монго нашел его? Является ли O (1), O (log n) или O (n), поскольку он должен сдвигать другие элементы?

ответ

1

Индексы коллекции используются только для документа, находящего часть обновления, а не самого обновления.

Так встроенный индекс на _id будет использоваться, чтобы найти документ, но $pull обновление потребует весь массив data читать и сканируется против {$lte: 123} запроса: O (п).

Добавленный на { _id: 1, data: 1 } индекс будет использоваться только если вы также включены data в Вашем запросе как:

model.update({_id: someId, data: {$lte: 123}}, {$pull: {data: {$lte: 123}}}).exec(); 

Но это было только обеспечить преимущество в том случае, когда data не содержал не элементов с значение < = 123 путем короткого замыкания обновления, поскольку документ больше не будет соответствовать критериям. Он по-прежнему не будет использоваться для нахождения элементов data для самого $pull.

Смежные вопросы