【问题标题】:PHP syntax for Mongo $set order statementMongo $set order 语句的 PHP 语法
【发布时间】:2013-08-13 14:12:22
【问题描述】:

我正在尝试使用how to update sequence number in mongodb safely 中描述的查询的 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);

我也从 $i 中删除了 +1,因为 Mongo 索引是基于 0 的

立即正确查询

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

【问题讨论】:

    标签: php arrays mongodb set


    【解决方案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) }
    ]
    

    附:你可以用$pushAll修改器代替$set,它可能更适合你。

    【讨论】:

    • 这有帮助!非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 2018-06-03
    • 2023-04-03
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多