0

今天是我使用 MongoDB 的第一天

我的收藏格式:

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

...

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

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

{fishSpecies:"Oceanic","fishStuff.fID":50, "fishStuff.fID:60}

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

更新:

我已经尝试了下面两位评论者留下的建议,仍然得到 7 个包含 fID 50 和 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 标志不起作用(或者我没有正确实现它),因为更新了零记录。

4

2 回答 2

0

如果您尝试根据它的序号位置(索引)删除,那么您不能直接删除。

您可以使用一种技术 $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}}
})
于 2013-04-03T00:26:46.387 回答
0

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

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

db.mycollection.update({'fishSpecies': 'Oceanic','fishStuff':{fID:50}}, {$pull:{'fishStuff': {fID: 60}}}, {multi:true})
于 2013-04-03T08:03:46.297 回答