【问题标题】:How do I remove an element in an array based on content?如何根据内容删除数组中的元素?
【发布时间】:2012-08-01 18:49:00
【问题描述】:

我正在使用 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});

可惜,事实并非如此。我试过这个并使用拉,但无济于事!我很难找到这个。有人知道根据其中一个字段的内容删除数组元素的语法吗?

【问题讨论】:

  • 就像 find() 返回整个文档一样, remove() 删除整个文档..
  • 正确 - 因为我实际上想删除整个文档!但似乎它根本没有删除任何东西。我的示例语法是正确的语法吗?
  • 我不熟悉 Perl 语法,但我查看了文档。看起来没问题。如果您的 find() 确实返回了一些文档,那么您的 remove() 理想情况下应该删除所有这些文档,因为您的查询与示例中提到的完全相同。
  • 你试过检查错误信息吗?您应该在运行后致电last_error() 以确保没有问题,或者运行$users->remove({"solution.username" => $username},{safe => 1}); 会因错误而发出嘶嘶声。

标签: perl mongodb


【解决方案1】:

MongoDB::Collection remove() 方法将删除与您的查询匹配的文档..所以绝对不是您要找的。​​p>

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

您的 solution.usernames 实际上是在一个数组中,因此您必须为要删除的字段添加一个数组索引,例如:

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

我不知道在solution 数组中取消设置与username 匹配的所有字段的更短语法,但您可以将多个solution.#.username 字段添加到$unset 命令。

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

【讨论】:

    猜你喜欢
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    相关资源
    最近更新 更多