2012-08-01 68 views
0

我正在使用MongoDB和Perl。这里是我的数据结构:如何根据内容删除数组中的元素?

{ 
    "_id" : ObjectId("501976f8005c8b541d000000"), 
    "err_id" : "err", 
    "solution" : [ 
     { 
      "attachment" : "attach", 
      "macr" : "macrs", 
      "yammer" : "yam", 
      "resolution" : "l", 
      "salesforce" : "salesforce", 
      "username" : "bob" 
     }, 
     { 
      "attachment" : "attach", 
      "macr" : "macrs", 
      "yammer" : "yam", 
      "resolution" : "losssss", 
      "salesforce" : "salesforce", 
      "username" : "bob" 
     } 
    ] 
} 

正如你所看到的,我有一个内部对象的数组。我使用Perl MongoDB库创建了它。

我熟悉在Perl MongoDB库中操作数组的一些语法。例如,我使用它来查找用户名与$username相同的条目。

$users->find({"solution.username" => $username}); 

我想移除元素是非常简单的:

$users->remove({"solution.username" => $username}); 

但很可惜,它不是这样。我已经尝试过,并使用拉,但无济于事!我很难找到这个。有人知道基于其中一个字段的内容去除数组元素的语法吗?

+0

就像find()返回整个文档一样,remove()删除整个文档。 – 2012-08-01 18:55:22

+0

正确的 - 因为它实际上是我想删除整个文档!但它似乎并没有删除任何东西。我的示例语法是否正确? – PinkElephantsOnParade 2012-08-01 18:56:12

+0

我不熟悉Perl语法,但是我检查了文档。它看起来没问题。如果你的find()返回一些文档,那么你的remove()应该理想地删除所有这些文档,因为你的查询完全一样,就像你在例子中提到的那样。 – 2012-08-01 19:03:11

回答

1

MongoDB ::收藏remove()方法将删除与您的查询匹配的文件..所以绝对不是你在找什么。

要删除特定字段,您应该使用$unset

你solution.usernames实际上是一个数组,所以你必须包括字段删除一个数组索引,例如:

$users->update({"_id" => '123'}, { 
    '$unset' => { 
     'solution.0.username' => 1, 
     'solution.1.username' => 1 
    } 
}); 

我不知道一个较短的语法未设置所有的在solution阵列中匹配username的字段,但可以将多个solution.#.username字段添加到$unset命令。

我上面的例子删除了数组中的前两个用户名项。如果匹配的文档有多个用户名条目,则每次运行此更新时,最多可删除两个条目(如果存在)。