mongodb:使用多个条件删除整个子元素

mongodb:使用多个条件删除整个子元素,mongodb,Mongodb,今天是我使用MongoDB的第一天 我的收藏格式: { "_id" : "ObjectId" :"4f2ff1d00cf2f86576f91a91"), "fishStuff" : [ { "name" : "GreatWhite", "fID" : 50 }, { "name" : "Hammerhead", "fID" : 51 }, { "name" : "White", "fID" : 60 } ], "fishSpecies" : "Oc

今天是我使用MongoDB的第一天

我的收藏格式:

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

我想在shell(直上mongo)中编写一个查询,删除第三个子项(名称:White),因为第一个子项存在于这组“fishStuff”中

我认为“where”条款应该是:

{鱼类种类:“海洋”、“鱼类资源.fID”:50,“鱼类资源.fID:60}

那么,如何删除整个“60”子元素呢?如果“50”也在同一个“fishStuff”组/数组中,我想删除集合中的每个“60”元素。此外,我之所以在“where”子句中包含fishSpecies,是因为可能存在多个fishSpecies

更新:

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

> 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标志不起作用(或者我没有正确地实现它),因为零记录被更新。

如果您试图根据其顺序位置(索引)删除,则无法直接删除

您可以使用一种技术$unset数组中的项,然后$pull它

db.mycollection.update({}, {$unset : {"fishStuff.50" : 1 }})
db.mycollection.update({}, {$pull : {"fishStuff" : null}})
但是值得注意的是,这并没有考虑fId,而仅仅依赖于文档在数组中的位置

要提取与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}}
})

我相信这就是你想要的

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

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

我正试图根据fID删除它。如果fID 50和fID60在同一个数组中,我想删除fID 60。因此,索引中的位置与我的目标无关。它们可能以任何顺序出现。我认为您想从数组中删除所有
鱼腥味。fID
==50 | | 60吗?您尝试过
db.mycollection.update吗({fishSpecies:“oceanic”},{$pull:{“fishStuff”:{fId:50}}},false,true)
以确保50有效。您可以使用$in或对您想要的每个元素运行更新
$pull
否,我为我写得不好的问题感到抱歉。我的目标是:如果fishStuff组(子元素的集合不确定正确的术语)包含50和60,我想删除60。请参阅我的更新答案