Просто измените функцию:
def notastonishinganymore(a = []): '''The name is just a joke :)'''
a = a[:]
a.append(5)
return a
Вы можете, но вы не должны http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field
Каждый объект в монго уже имеет идентификатор, и они сортируются в порядке размещения. Что не так с получением коллекции пользовательских объектов, итерацией по ней и использованием этого в качестве увеличенного ID? Er для работы по уменьшению карты полностью
Я знаю, что это старый вопрос, но я отправлю свой ответ для потомков ...
Это зависит от системы, которую вы строите, и от конкретных бизнес-правил.
Я создаю CRM с умеренным и крупным масштабом в MongoDb, C # (Backend API) и Angular (веб-приложение Frontend) и обнаружил, что ObjectId совершенно ужасен для использования в Angular Routing для выбора определенных объектов. То же самое с маршрутизацией API-контроллера.
Это предложение отлично работало для моего проекта.
db.contacts.insert({
"id":db.contacts.find().Count()+1,
"name":"John Doe",
"emails":[
"john@doe.com",
"john.doe@business.com"
],
"phone":"555111322",
"status":"Active"
});
Причина, по которой это идеально подходит для моего случая, но не во всех случаях, так как выше комментарий, если вы удалите 3 записи из коллекции, вы получите столкновения.
В моих бизнес-правилах указано, что из-за наших внутренних SLA нам не разрешено удалять корреспонденционные данные или записи клиентов дольше, чем потенциальная продолжительность работы приложения, которое я пишу, и поэтому я просто отмечаю записи с перечислением «Статус», которое либо «Активно», либо «Удалено». Вы можете удалить что-то из пользовательского интерфейса, и он скажет: «Контакт удален», но все приложение выполнило изменение статуса контакта на «Удалено», и когда приложение вызывает репозиторий для списка контактов, я фильтрую а затем удалите записи, прежде чем вставлять данные в клиентское приложение.
Поэтому db.collection.find (). Count () + 1 - идеальное решение для меня ...
Это не сработает для всех, но если вы не удалять данные, он отлично работает.
Как выбранный ответ говорит, что вы можете использовать findAndModify для генерации последовательных идентификаторов.
Но я категорически не согласен с мнением, что вы не должны этого делать. Все зависит от потребностей вашего бизнеса. Наличие 12-байтного идентификатора может быть очень ресурсоемким и в будущем вызвать значительные проблемы с масштабируемостью.
У меня есть подробный ответ здесь .
Сначала создайте коллекцию счетчиков, которая будет отслеживать последнее значение последовательности для всех полей последовательности.
db.createCollection("counters")
Используйте следующий код для вставки этого документа последовательности в коллекцию счетчиков -
db.counters.insert({_id:"tid",sequence_value:0})
Создание функции Javascript:
function getNextSequenceValue(sequenceName){
var sequenceDocument = db.counters.findAndModify({
query:{_id: sequenceName },
update: {$inc:{sequence_value:1}},
new:true
});
return sequenceDocument.sequence_value;
}
Вставить два документа:
db.products.insert({
"_id":getNextSequenceValue("tid"),
"product":"Samsung",
"category":"mobiles"
})
db.products.insert({
"_id":getNextSequenceValue("tid"),
"product":"Samsung S3",
"category":"mobiles"
})
Получить вставленные документы:
db.prodcuts.find()
OUTPUT
{«_id»: 1, «продукт»: «Samsung», «категория»: «мобильные»}
{"_id": 2, "product": " Samsung S3 "," категория ":" мобильные телефоны "}
findAndModify
. Также см. mongodb.org/display/DOCS/Object+IDs и алгоритм HiLo: stackoverflow.com/questions/282099/whats-the-hi-lo-algorithm – mnemosyn 5 December 2011 в 17:12