Как эффективно вставлять и обновлять значения документа mongodb из массива?

У меня есть коллекция тегов, которая содержит документы следующей структуры:

{
  word:"movie", //tag word
  count:1        //count of times tag word has been used
}

Мне дан массив новых тегов, которые необходимо добавить/обновить в коллекцию тегов:

["music","movie","book"]

Я могу обновить количество всех тегов, существующих в настоящее время в коллекции тегов, используя следующий запрос:

db.Tags.update({word:{$in:["music","movies","books"]}}, {$inc:{count:1}}), true, true);

Хотя это эффективная стратегия обновления, я не могу увидеть, какие значения тегов не были найдены в коллекции, а установка флага upsert в значение true не приводит к созданию новых документов для ненайденных тегов.

Вот где я застрял, как мне обрабатывать массовую вставку «новых» значений в коллекцию тегов? Есть ли другой способ, которым я мог бы лучше использовать обновление, чтобы оно обновляло новые значения тегов?

(Примечание: я использую Node.js с mongoose, решения с использованием mongoose/node-mongo-native были бы хороши, но не необходимы)

Спасибо вперед


person tjmehta    schedule 18.01.2012    source источник


Ответы (1)


Идея одновременного использования операторов upsert и $in неуместна. Это просто не сработает, так как нет никакой разницы между upsert if *any* in и upsert if *none* in.

В этом случае MongoDB делает версию, которую вы не хотите. Но вы не можете заставить его изменить поведение.

Я бы предложил просто выполнить три последовательных записи, перебирая массив тегов. Я знаю, что это раздражает и имеет неприятный запах кода, но именно так работает MongoDB.

person Gates VP    schedule 18.01.2012
comment
этот цикл действительно отстой ... Я использую python, который не скомпилирован, и циклы значительно замедлят мой код, поскольку мне постоянно нужно обновлять длинный список документов. Я изучаю другую базу данных на основе документов, чтобы увидеть, не могу ли я найти что-то лучше. - person RockScience; 30.10.2013