Как установить длину массива после обновления через $ addToSet в mongodb? - PullRequest
0 голосов
/ 07 сентября 2011

Структура документа выглядит следующим образом,

{
    blacklists:[]         // elements should be unique
    blacklistsLength:0    // length of blacklists
}

Добавить наборы значений к blacklists легко.

db.posts.update({_id:...}, {$addtoSet:{blacklists:{$each:['peter', 'bob', 'steven']}}});

Но как я могу обновить blacklistLength одновременно, чтобы отразить изменения?

Ответы [ 4 ]

4 голосов
/ 07 сентября 2011

Это невозможно.Либо у вас есть

  1. Обновите длину отдельно с помощью последующей команды findAndModify, либо

  2. Вы можете сделать это по имени и переписать запрос, используя отрицаниев ваших критериях и $ push, а не $ addToSet (необязательно, но намного быстрее с большими черными списками, поскольку addToSet всегда равен o (n) независимо от индексов):

    db.posts.update({_id:..., blacklists:{$ne:'peter'}}, {$push:{blacklists:{'peter'}},$inc:{blacklistsLength: 1}});
    

последний является совершенно безопасным, так как список и длина настраиваются атомарно, но, очевидно, имеет немного ухудшенную производительность.Поскольку она также имеет преимущество в улучшении общей производительности из-за проблемы производительности $ push против $ addToSet для больших массивов (и черные списки имеют тенденцию становиться огромными, и помните, что версия обновления $ push использует индекс в черном списке в критериях обновления, в то время как$ addToSet НЕ будет использовать индекс во время сканирования набора), как правило, это лучшее решение.

1 голос
/ 07 сентября 2011

Не сработает ли следующее?

db.posts.update({_id:...}, {
  $addtoSet:{blacklists:{$each:['peter', 'bob', 'steven']}},
  $set: {blacklistsLength: ['peter', 'bob', 'steven'].length}
});
0 голосов
/ 20 февраля 2013

Когда вы помещаете элементы в базу данных, просто запросите элемент, чтобы увидеть, находится ли он во встроенном массиве. Таким образом, вы избегаете нажатия на дубликаты элементов и увеличиваете счетчик по мере добавления новых элементов.

q = {'blacklists': {'$nin': ['blacklist_to_insert'] }}
u = {
 '$push' : {'blacklists': { 'blacklist_to_insert' } },
 '$inc' : {'total_blacklists': 1 }
}
o = { 'upsert' : true }

db.posts.update(q,u,o)
0 голосов
/ 07 сентября 2011

У меня была похожая проблема, см. Обсуждение здесь: google groups mongo

Как вы можете заметить, после этого обсуждения была открыта ошибка: Mongo Jira

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