0

我有这样的文档结构:

{
    "_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 的所有项目。这应该same从 Bill 和 Joe 中删除数组中的第一个条目。这只是一个示例文档,有很多相同的。

在我的脑海中,这就是我需要做的:

  1. 遍历所有文件,
  2. 检查数组的任何split值是否<4same
  3. 删除这些(也许使用update$pull?)

谁能帮我实现这一目标?

4

1 回答 1

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 ) ),
            )
        }
    }
}
于 2012-11-14T11:20:26.707 回答