Почему оператор $ pull не работает на MongoDB при использовании пустых критериев? - PullRequest
2 голосов
/ 09 октября 2011

У меня есть такие узлы:

[_id] => MongoId Object (
    [$id] => 4e90cb3cd68417740c000017
)
[label] => mystery
[owner] => me
[parents] => Array (
    [0] => Array (
        [id] => MongoId Object (
            [$id] => 4e8c6bb6d68417340e0004ca
        )
        [owner] => userid
        [timestamp] => 1318112522
    )
)
[timestamp] => 1318112060
[translabel] => mystery
[type] => 0

Я пытаюсь удалить родителей с идентификатором 4e8c6bb6d68417340e0004ca, где бы они ни находились.

Например, это должно было работать (последний Монго):

db.nodes.update({},{$pull : {"parents": { "id" : ObjectId("4e8c6bb6d68417340e0004ca") }}});

или равно в PHP (последний драйвер и т. Д.):

$mongodb->nodes->update(array(),array('$pull'=> array('parents'=>array('id'=> new MongoId("4e8c6bb6d68417340e0004ca")))));

оба ничего не делают!


с другой стороны:

db.nodes.update({"_id": ObjectId("4e90cb3cd68417740c000017")},{$pull : {"parents": { "id" : ObjectId("4e8c6bb6d68417340e0004ca") }}});

или равно в PHP:

$mongodb->nodes->update(array('_id' => new MongoId("4e90cb3cd68417740c000017"),array('$pull'=> array('parents'=>array('id'=> new MongoId("4e8c6bb6d68417340e0004ca")))));

работают на отлично! Это ошибка? Является ли проблемой то, что я использую «id» вместо «_id» с объектами MongoID в моих вложенных документах? Заранее спасибо за любую помощь!

1 Ответ

3 голосов
/ 09 октября 2011

Вы пытались включить multi flag в команде обновления

db.collection.update( criteria, objNew, upsert, multi )

multi - указывает, что все документы, соответствующие критериям соответствия, должны быть обновлены, а не только один.Может быть полезно с $ операторами ниже.

и измените ваш запрос на

db.nodes.update({},{$pull : {"parents": { "id" : ObjectId("4e8c6bb6d68417340e0004ca") }}},false,true);

или

db.nodes.update({ "_id" : { $exists : true } },{$pull : {"parents": { "id" : ObjectId("4e8c6bb6d68417340e0004ca") }}},false,true);

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

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