Увеличить номер таблицы автоматически в mongodb [duplicate]

Просто измените функцию:

def notastonishinganymore(a = []): '''The name is just a joke :)'''
    a = a[:]
    a.append(5)
    return a
13
задан est 5 December 2011 в 12:38
поделиться

4 ответа

Вы можете, но вы не должны http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field

Каждый объект в монго уже имеет идентификатор, и они сортируются в порядке размещения. Что не так с получением коллекции пользовательских объектов, итерацией по ней и использованием этого в качестве увеличенного ID? Er для работы по уменьшению карты полностью

8
ответ дан Konstantin Pribluda 20 August 2018 в 16:12
поделиться
  • 1
    Проблема идет параллельно. итерация будет испускать повторяющийся инкрементный идентификатор. – est 5 December 2011 в 12:57
  • 2
    Этот идентификатор вам нужен только для анализа, а не для хранения данных. IIUC, вам нужен последовательный идентификатор только как индекс для вашего массива, так что вы можете построить битсет. Вы можете достичь этого, не сохраняя этот инкрементный идентификатор в базе данных, и вы можете построить свой бит-массив без извлечения данных клиенту – Konstantin Pribluda 5 December 2011 в 13:49
  • 3
    Весьма неразумно получать incr ID по итерации каждый раз, особенно вы имеете дело с миллионами пользователей за каждый день. Dong MAU потребует как 30x итераций. – est 5 December 2011 в 15:22
  • 4
    Неразумно использовать инкрементные последовательности, когда у вас миллионы пользователей. Однако миллионы пользователей не очень хорошо играют с битовыми массивами, не так ли? Мне трудно сказать, чего именно вы пытаетесь достичь. Параллелизм не будет проблемой с помощью findAndModify. Также см. mongodb.org/display/DOCS/Object+IDs и алгоритм HiLo: stackoverflow.com/questions/282099/whats-the-hi-lo-algorithm – mnemosyn 5 December 2011 в 17:12
  • 5
    Я просто хочу сохранить некоторые растровые данные Redis в Mongo blog.getspool.com/2011/11/29/… для последующих запросов. – est 12 December 2011 в 05:23

Я знаю, что это старый вопрос, но я отправлю свой ответ для потомков ...

Это зависит от системы, которую вы строите, и от конкретных бизнес-правил.

Я создаю 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 - идеальное решение для меня ...

Это не сработает для всех, но если вы не удалять данные, он отлично работает.

6
ответ дан Alex Nicholas 20 August 2018 в 16:12
поделиться
  • 1
    есть ли какая-то особая причина, по которой mongodb утверждает, что вам нужно использовать функцию и последовательность счетчиков вместо вашей души как db.xxx.find.count + 1? может быть, обработка трансинга возится? ваше решение хорошо работает в среде веб-серверной среды? Спасибо за ваш ответ – ckinfos 17 September 2017 в 07:37
  • 2
    Это не будет хорошо в параллельной настройке. Вы можете легко получить документы с одним и тем же _id, если они одновременно сделали подсчет. – zephos2014 10 January 2018 в 22:47
  • 3
    абсолютно! В моем случае мне не нужно иметь дело с параллелизмом или осколками вообще, поэтому у меня нет проблем с помощью find (). Count () + 1 Как и в моем первоначальном ответе, это не будет работать для всех в каждом но он определенно работал в моем конкретном сценарии. Приложение работает уже почти 12 месяцев без каких-либо проблем в отношении моего увеличения. – Alex Nicholas 21 March 2018 в 00:12

Как выбранный ответ говорит, что вы можете использовать findAndModify для генерации последовательных идентификаторов.

Но я категорически не согласен с мнением, что вы не должны этого делать. Все зависит от потребностей вашего бизнеса. Наличие 12-байтного идентификатора может быть очень ресурсоемким и в будущем вызвать значительные проблемы с масштабируемостью.

У меня есть подробный ответ здесь .

13
ответ дан Community 20 August 2018 в 16: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 "," категория ":" мобильные телефоны "}

7
ответ дан Rizwan Siddiquee 20 August 2018 в 16:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: