删除MongoDB中的子数据

时间:2012-11-14 09:26:48

标签: mongodb database

我有这样的文档结构:

{
    "_id" : ObjectId("5087b582da50fc570073e094"),
    "grade" : "A",
    "distance" : "470",
    "items" : [
        {
            "history" : [                   
                ...
            ],
            "same" : [
                {
                    "split" : " 1.48",
                    "time" : " 28.56",
                },
                {
                    "split" : " 4.48",
                    "time" : " 28.56",
                },
                ...
            ],
            "name" : "Bill"
        },
        {
            "history" : [                   
                ...
            ],
            "same" : [
                {
                    "split" : " 2.48",
                    "time" : " 28.26",
                },
                {
                    "split" : " 4.49",
                    "time" : " 28.57",
                },
                ...
            ],
            "name" : "Joe"
        },
        {
            ...

        }

    ]
}

我想删除分割值为< same数组的任何项目。 4。 这应该删除Bill和Joe的same数组中的第一个条目。 这只是一个示例文档,有许多是相同的。

在我的脑海里,这就是我需要做的事情:

  1. 遍历所有文档,
  2. 检查split数组的same值是否为< 4
  3. 删除这些(可能使用update$pull?)
  4. 任何人都可以帮我实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

首先,我建议你将分组和时间存储为数字,而不是字符串,因为与它进行比较并不好。

使用当前的数据结构,您必须使用您喜欢的任何语言在程序中编写脚本。假设这是你需要做的一次性事情,你写的很好。我不认为通过文档的原子更新可以做到这一点,所以相反,你将不得不在脚本/程序中进行所有数据争论。

如果这是一项非常常见的任务,而不仅仅是一次性的事情,那么我会 建议您将数据重组为以下内容:

{
    "_id" : ObjectId("5087b582da50fc570073e094"),
    "grade" : "A",
    "distance" : "470",
    "history" : [
        ...
    ],
    "same" : [
        {
            "split" : " 1.48",
            "time" : " 28.56",
        },
        {
            "split" : " 4.48",
            "time" : " 28.56",
        },
        ...
    ],
    "name" : "Bill"
},
{
    "_id" : ObjectId("5087b582da50fc570073e095"),
    "grade" : "A",
    "distance" : "470",
    "history" : [
        ...
    ],
    "same" : [
        {
            "split" : " 2.48",
            "time" : " 28.26",
        },
        {
            "split" : " 4.49",
            "time" : " 28.57",
        },
        ...
    ],
    "name" : "Joe"
},

这样,你可以在找到每个元素(PHP中的代码)之后通过拉动很容易地删除所有这些时间:

$m = new Mongo();
$c = $m->dbname->collectionname;

foreach ( $c->find() as $r )
{
    foreach ( $r['same'] as $times )
    {
        if ($times['split'] < 4 )
        {
            $c->update(
                array( '_id' => $r['_id'] ),
                array( '$pull' => array( 'same' => $times ) ),
            )
        }
    }
}