【问题标题】:php & mongodb: using $addToSet w/ $eachphp & mongodb: 使用 $addToSet w/ $each
【发布时间】:2013-07-25 22:11:30
【问题描述】:

这个问题和我的很相似:Is there a way to check if one of the array entries contains a sub-array in 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 shell 版本 2.4.3 'find()')来查看插入的结果。

【问题讨论】:

    标签: mongodb mongodb-php


    【解决方案1】:

    对于初学者,将布尔值作为第三个参数传递给 MongoCollection::update() 在 1.3.0 中已弃用。在下面的示例中,我使用现在推荐的 $options 数组作为该方法的第三个也是最后一个参数。

    您能否验证示例中第 78 个数组元素的 $each 键正是这五个字符并且不包括前导不可打印字符?如果我在 $each 前加上 chr(13)(即换页),MongoDB 不会发现我正在使用运算符,并且很乐意将对象参数添加到集合/数组中。

    除此之外,我可以重现上述内容的唯一方法是制作一个更新,其中 $each 的值是一个对象:

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

    这会导致插入以下内容(使用 Mongo shell,以便我们可以区分数组和对象):

    {
        "_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)
                }
            }
        ]
    }
    

    【讨论】:

      猜你喜欢
      • 2017-05-30
      • 2020-08-16
      • 1970-01-01
      • 2015-12-10
      • 2013-08-26
      • 1970-01-01
      • 2015-02-10
      • 2015-04-29
      • 2013-08-23
      相关资源
      最近更新 更多