Допустим, у нас есть коллекция под названием "вещи", где "вещь" - это такой документ:
thing : {
field1 : value1,
field2 : value2,
...
fieldn : valuen,
someDate : dateValue
}
Используя С# (официальный драйвер), мы можем обновить несколько документов в коллекции "вещи", выполнив следующие действия:
things.Update(query, update, UpdateFlags.Multi);
Вопрос: есть ли способ упорядочить "вещи" в поле "someDate", а затем взять фиксированное количество документов для обновления?
что-то вроде:
things.Update(query, update, UpdateFlags.Multi).orderby('somedate').take(1000)
Спасибо.
Вам нужно будет найти критерий, который соответствует всем документам, которые вы хотите обновить. Например, если ваши документы имеют ObjectId как _id
поле, вы можете сделать это:
var highId = things.Find(query).SetSkip(1000).First().Id;
а затем выполните обновление следующим образом:
things.Update(Query.And(Query.<Thing>.LTE(p => p.Id, highId), otherCriteria),
update, UpdateFlags.Multi)
Это, однако, также обновит все документы, которые были вставлены совсем недавно, то есть между запросом и оператором обновления. Вы также можете запросить первый и последний _id
и использовать пару GT/LTE
.
Естественно, для этого требуется некоторый монотонный ключ (например, ObjectId или временная метка).
Также имейте в виду, что метки времени создаются клиентами, поэтому ожидайте некоторого перекоса часов.