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の値が4 未満かどうかを確認しますsame
  3. これらを削除します(おそらく and を使用update$pullますか?)

誰でもこれを達成するのを手伝ってもらえますか?

4

1 に答える 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 に答える