为什么$ pull运算符在使用空标准时不能在MongoDB上运行?

时间:2011-10-09 08:07:19

标签: mongodb pull mongodb-php

我有这样的节点:

[_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

我要做的是删除ID为4e8c6bb6d68417340e0004ca的父母,无论他们身在何处。

例如,这应该是有效的(最新的Mongo):

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

或equaly(最新的驱动程序等):

$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中的

或equaly:

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

工作得很好!这是一个错误吗?在我的子文档中使用MongoID对象的“id”而不是“_id”是一个问题吗?在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

您是否尝试在更新命令

上启用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);

我自己没有测试过代码,但我相信上面的任何一个都可以运行..