2

mongodb のシーケンス番号を安全に更新する方法で説明されているクエリの PHP バージョンを使用して、複数の配列要素を更新しようとしています。

クエリについて説明します。

db.so.update(
{ _id: new ObjectId("4f55e7ba362e2f2a734c92f8")},
{ $set : { 'subs.1.order' : 3, 'subs.2.order' : 2 } }
);

ドキュメントに「注文」フィールドを追加するクエリを作成しています

{
"_id": {
    "$oid": "5209acfd0de2316335000001"
},
"bookListId": "116ad5af-7cc6-4652-9bb3-aea852e584e8",
"favoriteBook": [
    {
        "title": "One Favorite Book",
    },
    {
        "title": "Another Favorite Book",
    },
    {
        "title": "A Third Favorite Book",
    }
]
}

..そしてPHPでそれをやっています

$criteria = array('bookListId' => $bookListId);

$favoriteBookOrder = array();

for($i=0;$i<sizeof($order);$i++) {
    $key = 'favoriteBook.'.($i+1).'.order';
    $val = $order[$i];
    $favoriteBookOrder[] = array($key=>intval($val));
}

$setFavoriteBookOrder = array('$set' => $favoriteBookOrder);
$collection->update($criteria, $setFavoriteBookOrder);

しかし、クエリに配列の正しい構成がないため、これは結果を生成しません..

error_log(json_encode($setupdated));

出力

{"$set":[{"favoriteBook.1.order":2},{"favoriteBook.2.order":1},{"favoriteBook.3.order":3}]}

引用符、配列全体を囲む括弧、および各項目を囲む中括弧が多すぎることに気付いた場合。これがエラーの原因だと思います:

"Invalid modifier specified: $set"

PHPで配列を構築するための正しい構文は何ですか? ありがとう!

編集

これが修正です

$favoriteBookOrder[] = array($key=>intval($val));

should be 

$favoriteBookOrder[$key] = intval($val);

また、Mongo インデックスは 0 ベースであるため、$i から +1 を削除しました

今すぐ正しいクエリ

{"$set":{"favoriteBook.0.order":1,"favoriteBook.1.order":2,"favoriteBook.2.order":3}}
4

1 に答える 1

3

クエリを正しく機能させるには、1 行を変更する必要があります。

 $favoriteBookOrder[] = array($key=>intval($val));

 $favoriteBookOrder[$key] = intval($val);

しかし、次のような結果になるため、結果に満足できないと思います。

"favoriteBook" : {
    "0" : { "order" : NumberLong(123) },
    "1" : { "order" : NumberLong(321) },
    "2" : { "order" : NumberLong(456) }
}

次のようにコードを書き直すことをお勧めします。

for($i=0;$i<sizeof($order);$i++)
    $favoriteBookOrder[$i]['order'] = $order[$i];

$setupdated = array('$set' => ['favoriteBookOrder' => $favoriteBookOrder]);

そしてあなたは得るでしょう:

"favoriteBookOrder" : [
    { "order" : NumberLong(123) },
    { "order" : NumberLong(321) },
    { "order" : NumberLong(456) }
]

PS$pushAllの代わりに modificator を使用$setできます。より適している可能性があります。

于 2013-08-13T05:54:01.407 に答える