MongoDb: Хранить массив фиксированной длины внутри объекта, с политикой fifo и некоторыми другими условиями? - PullRequest
2 голосов
/ 29 марта 2011

У меня есть несколько скриптов, которые обновляют записи mongoDb, которые выглядят так:

{ "_id" : "c12345", "arr" : [
        {
                "i" : 270099850,
                "a" : 772,

        },
        {
                "i" : 286855630,
                "a" : 622,

        }
] }

Скрипты добавляют элементы в массив «arr» объекта, используя «pushAll», который работает отлично и очень быстро.

Мое требование : 1. Продолжайте изменять эти объекты, но обрабатывайте их, когда размер arr превышает 1000.

  1. Когда arr превышает 1000, я выбираю несколько важных записей, отбрасываю некоторые менее важные, и откажитесь от некоторых старых и уменьшите размер arr до 500.

Текущая реализация : 1. Сценарий A берет некоторые данные откуда-то и находит объект в другой коллекции. используя поле "_id", и добавляет эти данные в массив "arr".

  1. Тот же скрипт, когда находит элемент, проверяет размер "arr", если меньше 1000, он добавляет к arr нормальное значение, в противном случае переходит к обработке PHP-объекта, полученного через find, модифицирует его и обновляет монго запись с использованием «SET».

Текущие узкие места : 1. Я хочу, чтобы скрипт обновления работал очень быстро. Upserts быстрые, однако операции поиска и изменения медленнее для каждой записи.

Идеи на уме : 1. Вместо обработки элементов EXCEEDED в сценариях установите флаг bool в объекте и обработайте его с помощью отдельного сценария Data Cleaner. (но это также требует от меня НАЙТИ объект перед выполнением UPSERT).

  1. всегда поддерживает переменную COUNT в объекте, которая хранит текущую длину «arr», и использует ее в скрипте очистителя данных, который очищает все объекты, извлеченные через mongodb query "count"> 1000. (Так как mongodb не позволяет оператору $ size иметь диапазоны, а в настоящее время имеет только равные условия, мне нужен собственный счетчик COUNT)

Любые другие чистые и эффективные идеи, которые вы можете предложить? Спасибо.

Ответы [ 2 ]

7 голосов
/ 07 января 2013

В версии 2.3.2 mongo была добавлена ​​новая функция .Теперь есть $ slice, который можно использовать для сохранения фиксированного размера массива.

Например:

t.update( {_id:7}, { $push: { x: { $each: [ {a:{b:3}} ], $slice:-2, $sort: {'a.b':1} } } } )
2 голосов
/ 30 марта 2011

Нет простого способа сделать это, однако это хорошая идея:

  1. Вместо обработки элементов EXCEEDED в сценариях, установите флаг bool в объекте и обработайтеон использует отдельный скрипт Data Cleaner.

Запуск отдельного скрипта определенно имеет для этого смысл.

MongoDB не имеет метода для массивов "фиксированной длины".Но у него определенно нет способа сделать что-то вроде этого:

выбрать некоторые важные записи, отменить некоторые менее важные и отказаться от старых

ЕдинственноеИсключение я бы сделал, это флаг "bool".Вы, вероятно, хотите просто прямой счетчик.Если вы можете индексировать по этому счетчику, тогда нужно быстро найти эти «слишком большие» массивы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...