Курсор
В монго также есть понятие курсора.cur = db.people.find();null;//нал в конце обеспечивает, что выборка не начинается мгновенно
cur.hasNext();
cur.next();
while(cur.hasNext()) printjson(cur.next());
cur.limit(5);null;
cur.sort({name: -1});null;
limit, skip и sort могут быть применены только сразу после получения курсора. Их эффект срабатывает на стороне сервера, а не клиента, то есть по сети летит именно готовый результат ограничения и сортировки, а не все как есть, а потом на стороне клиента он обрезается.
Эти команды срабатывают только до момента когда курсор подвинулся (до вызова hasNext & next).
cur.sort().limit(5).skip(2);null;
db.scores.find({type: "exam"}).sort({score: -1}).skip(50).limit(20);
Доказательство того, что все происходит на стороне сервера, можно увидеть с помощью команды skip:
> cur.sort({ name: -1}).limit(3).skip(2); null;
> while (cur.hasNext()) printjson(cur.next());
{"id" : ...}
{"id" : ...}
{"id" : ...}
Если бы это выполнялось бы на клиенте, мы бы увидели один результат, мы же видим три - просто из сортировки были выкинуты первые два результата, предоставлены последующие три.
Counting
db.score.count({type: "exam"});
Редактирование
Апдейт в MongoDB делается только на одно поле, если селектору подходят много, то изменяется только первый документ/рекорд.
Обновление документа целиком
db.people.update(selector, exact_replasor);
Все документы прошедшие фильтрацию потеряют все свои поточные поля кроме _id и получать только те, которые находятся в exact_replasor.
Обновление $set
А так мы можем изменить только конкретные поля документа:
exact_replasor = {
$set: {
age: 31
}
};
exact_replasor = {
$inc: {
age: 1
}
};
Upsets
- директива, которая при установленном флаге в тру, создает новую запись и обеспечивает ее указанными для обновления свойствами, если ни одна запись не подошла селектору, если же подошла, то изменяются существующие.db.foo.update({username:'bar'}, {'$set':{'interests':['cat', 'dog']}}, {upsert: true} );
При этом в новосозданную запись вставляются также поля фильтра(селектора). Тоесть допустим у нас в коллекции не оказалось юзернейм с именем бар, тогда в коллекцию вставится следующая запись:
{ "_id" : ObjectId("507b78232e8dfde94c149949"), "interests" : [ "cat", "dog" ], "username" : "bar" }
Multi-update
Но все же возможно и заапдейтить несколько документов, для этого нужно указать директиву.
db.people.update({}, {'$set':{'title': 'Dr'}}, {multi: true} );
{} - под этот селектор подходят все документы.Мульти редактирование не атомарно - в монго только один сред отвечает за изменения в базу, при мульти изменяется 10 записей и лок возвращается, что другие запросы на запись могли сработать и потом он продолжается и так пока все поля подошедшие под селектор не обновятся.
Эти паузы совуться йилдинг ( pausing is called yeilding).
Если нам нужна транзакционность, нам нужно ее организовывать на уровне приложения и работать через приложение.
Removing
.remove(selector) - удаляет один за одним подошедшие документы, если мы не указываем селектор, удаляются все, но опять же один за одним, при этом их метадата(индексы) может оставаться на диске. Тут таже история, что и мультиапдейт - по десять и делаются паузы для передачи котнроля другим правкам. Единственный способ удалить только некоторые документы из колекции..drop() - одним махом удаляет все документы коллекции, намного эффективнее по-элементного удаления. По-идее это атомарная операция. Этим способом мы не можем удалить только некоторые документы коллекции - метод не принимает селектор.
Удаление определенных полей в документах
db.people.update($selector, { $unset: {field1: 1, feld2: 1}});
Правка массивов
i-го элемента(в данном случае 3-го)
db.colect.update(selector, {$set: {"arrname.3": 5}})
Добавление в конец
db.colect.update(selector, {$push: {"arrname": 6}})
db.colect.update(selector, {$pop: {"arrname": N}})
Удалить первых N(за счет -N)
db.colect.update(selector, {$pop: {"arrname": -N}})
Удалить по значению
db.colect.update(selector, {$pull: {"arrname": "this_val_will_be_removed"}})
Удалить несколько $pullAll
Добавить, если только элемента нет в массиве - $addToSet
Комментариев нет:
Отправить комментарий