Смущен тем, как $ pullAll работает в MongoDB - PullRequest
9 голосов
/ 05 мая 2011

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

db.blog.findOne()
{
        "_id" : ObjectId("4dc1c938c4bfb4d21a000001"),
        "blogid" : 1,
        "body" : "Lorem ipsum dolor",
        "comments" : [
                {
                        "id" : 1,
                        "name" : "Alex",
                        "comment" : "Test",
                        "approved" : 1
                },
                {
                        "id" : 2,
                        "name" : "Phil",
                        "comment" : "Test",
                        "approved" : 1
                },
                {
                        "id" : 3,
                        "name" : "Joe",
                        "comment" : "Test",
                        "approved" : 0
                }
        ],
        "no_comments" : 11,
        "title" : "Hello world"
}

Если я выполню запрос

db.blog.update({'blogid':1}, { $pull : { 'comments' : {'approved' : 0} } });

, тогда будет удален третий комментарий.

Если вместо этого я хочу получить все комментарии, где утверждено 0 или 1, следующий запрос не работает:

db.blog.update({'blogid':1}, { $pullAll : { 'comments' : {'approved' : [0,1]} } });

Я получаю ошибку

Модификатор $ pushAll / pullAllразрешено только для массивов

Может кто-нибудь объяснить, где я не так?

Спасибо

Ответы [ 2 ]

15 голосов
/ 03 марта 2013

$pullAll требует точного соответствия. Вы можете использовать $pull вместо:

{ $pull : { 'comments' : {'approved' : {$in : [0,1]}} } });
4 голосов
/ 05 мая 2011

Это потому, что $ pullAll принимает массив, а не объект. Я думаю, что следующий код должен работать:

{ $pullAll : { 'comments' : [{'approved' : 1}, {'approved' : 0}] } });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...