mongodb:删除具有多个条件的整个子元素

时间:2013-04-02 20:54:25

标签: mongodb

今天是我使用MongoDB的第一天

我的收藏格式:

{ "_id" : "ObjectId" :"4f2ff1d00cf2f86576f91a91"),
"fishStuff" : [
{
    "name" : "GreatWhite",
    "fID" : 50
},
{
    "name" : "Hammerhead",
    "fID" : 51
},
{
    "name" : "White",
    "fID" : 60
}
], "fishSpecies" : "Oceanic"

...

我想在shell中写一个查询(直接mongo),它将删除第三个孩子(名字:白色),因为第一个孩子存在于这组“fishStuff”中。

我相信“where”子句应该是:

{fishSpecies:“Oceanic”,“fishStuff.fID”:50,“fishStuff.fID:60}

那么如何删除整个“60”子元素?当“50”也在同一个“fishStuff”组/数组中时,我想删除集合中的每个“60”元素。另外,我在“where”子句中包含fishSpecies的原因是因为有多种fishSpecies可能性。

更新:

我已经尝试了以下两位评论者留下的建议,并且仍然得到包含fID 50和60的子对象集的7个实例(在运行下面的计数之后):

> db.fish.update({fishSpecies:"oceanic","fishStuff.fID":50}, {$pull : {"fishStuff" : { fID : 60}}},false, true)
> db.fish.find({"fishSpecies":"oceanic","fishStuff.fID":50, "fishStuff.fID":60}).count()
7

multi:true标志不起作用(或者我没有正确实现),因为更新了零记录。

2 个答案:

答案 0 :(得分:0)

如果您尝试根据其序号位置(索引)进行删除,则无法直接删除。

您可以使用一种技术来取消设置数组中的项目然后$拉它。

db.mycollection.update({}, {$unset : {"fishStuff.50" : 1 }})
db.mycollection.update({}, {$pull : {"fishStuff" : null}})

值得注意的是,这并没有考虑到fId,而只依赖于文档在数组中的位置。

要拉出符合您要求的项目,您需要:

 db.mycollection.update({}, {$pull : {"fishStuff" : { fId : 50}}})

编辑:

如果您想从文档数组包含fId == 50和fId == 60的数组中删除fId == 50的元素,您应该能够:

db.mycollection.update({
    "fishSpecies":"oceanic",
    "fishStuff.fId": { $all : [50,60]}}, 
    // update
    {$pull : {"fishStuff" : { fId : 50}}
})

答案 1 :(得分:0)

我相信这就是你要找的......

检查mycollection以查找与fishSpecies匹配的文档与Oceanic和fID = 50-如果是,则删除fID = 60元素。 multi:true扫描整个集合。

db.mycollection.update({'fishSpecies': 'Oceanic','fishStuff':{fID:50}}, {$pull:{'fishStuff': {fID: 60}}}, {multi:true})