0

この質問は私のものと非常に似ています:配列エントリの1つにMongoDBのサブ配列が含まれているかどうかを確認する方法はありますか?

ただし、私の場合、いくつかの更新でまだ問題が発生しています。タグを取得するアグリゲーターを介してデータを取得しています。タグはこんな感じ$tags = array("red","green","blue","purple",...);

私の更新クエリは次のようになります。

$criteria = array('_id' => new MongoId($myID));

$db->aggregation->update($criteria, 
                         array('$addToSet' =>
                            array('tags' =>
                               array('$each' => $tags)))), 
                         true); //add tags

信じられないかもしれませんが、問題なく動作する場合もありますが、そうでない場合もあります。以下の例で、どれが機能し、どれが機能しなかったかを確認できます。

[74] => red
[75] => orange
[76] => yellow
[77] => green
[78] => Array (
    [$each] => Array (
        [0] => blue
        [1] => indigo
        [2] => purple
    )
)
[79] => violet
[80] => brown
[81] => black

これがコレクションの配列に適切に挿入される場合とそうでない場合がある理由を誰かに説明できますか? phpmoadmin (および MongoDB シェル バージョン 2.4.3 'find()') を使用して、挿入の結果を表示しています。

4

1 に答える 1

0

まず、 MongoCollection::update()の 3 番目の引数としてブール値を渡すことは、1.3.0 で非推奨になりました。以下の例では、現在推奨$optionsされている配列を、そのメソッドの 3 番目で最後の引数として使用しています。

$eachあなたの例の 78 番目の配列要素のキーが正確にその 5 文字であり、先頭の印刷不可能な文字が含まれていないことを確認できますか? 接頭辞 (つまり、フォーム フィード) を付ける$eachchr(13)、MongoDB は演算子を使用していることを認識せず、オブジェクト引数をセット/配列に喜んで追加します。

それを超えて、上記を再現できる唯一の方法は、$eachの値がオブジェクトである更新を作成することです。

$c->update(
  ['_id'=>1],
  ['$addToSet' => [
    'tags' => ['$each' => (object) [1,2,3,4,5]],
  ]],
  ['upsert' => true]
);

これにより、以下が挿入されます (配列とオブジェクトを区別できるように Mongo シェルを使用します)。

{
    "_id" : NumberLong(1),
    "tags" : [
        {
            "$each" : {
                "0" : NumberLong(1),
                "1" : NumberLong(2),
                "2" : NumberLong(3),
                "3" : NumberLong(4),
                "4" : NumberLong(5)
            }
        }
    ]
}

他の要素がすでに にtagsある場合、上記は次のようにさらに配列に入る可能性があります。

{
    "_id" : NumberLong(1),
    "tags" : [
        NumberLong(1),
        NumberLong(2),
        NumberLong(3),
        NumberLong(4),
        NumberLong(5),
        {
            "$each" : {
                "0" : NumberLong(1),
                "1" : NumberLong(2),
                "2" : NumberLong(3),
                "3" : NumberLong(4),
                "4" : NumberLong(5)
            }
        }
    ]
}
于 2013-08-19T17:20:00.853 に答える