2012-02-14 67 views
1

我有一个文件,看起来像这样:如何删除MongoDB中的嵌入式文档?

{listName: 'LoremIpsum' 
listItems: [{productDescription: "", productImage: ""}...]} 

我将如何去从listItems中删除项目,如果productImage不存在?

我已经试过没有结果如下:

db.lists.update({"item.productImage":{$exists: false}}, {$unset:{"item":1}}, false, true) 
+0

您能否更新您的原始文档结构?因为在你的文档它是listitems.productimage和在你的查询它是item.productimage ..哪一个是正确的.. – RameshVel 2012-02-15 06:14:01

回答

3

注意,$拉可以包含元素匹配标准。因此,此单个更新将删除不包含字段“productImage”的项目:

db.lists.update({}, {$pull:{listItems:{productImage:{$exists:false}}}}, false, true) 
+0

这个工作。只需编辑命令即可更新所有文档。 db.lists.update({},{$ pull:{listItems:{productImage:{$ exists:false}}}},false,true) – techpaisa 2012-02-16 05:44:43

0

看来,你不能一步到位将其删除。但这里有两个步骤的组合:

// unset matching array element. That'll leave null on its place 
db.lists.update({"listItems.productImage":{$exists: false}}, 
       {$unset:{"listItems.$":1}}); 

// remove nulls from array 
db.lists.update({listItems: null}, 
       {$pull: {listItems: null}}); 
+0

刚试过这个,但它没有奏效。也许是因为它实际上是一个内部数组? – James 2012-02-15 00:04:30

0

您应该能够使用$pull operator,这将删除与您指定的匹配准则的一切。

db.lists.update({}, {"$pull": {"listItems" : {"productImage" : {$exists: false}} }})