今天是我使用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标志不起作用(或者我没有正确实现),因为更新了零记录。
答案 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})