嵌入式数组的upsert缺失值

时间:2013-10-28 13:44:29

标签: php mongodb mongodb-php

我正在使用mongodb(2.4.7 64位Linux操作系统)来确定它是否是现有mysql数据库的绝佳替代品。相当整洁的是upsert功能 - 但我在这里有一个问题。有人可以解释为什么关键“identification.YAHOO”=> “DTE.DE”没有附加到数组但会被“DETGY”关联?

<?php

  $oMongoClient = new MongoClient();
  $oMongoDB = $oMongoClient->test;
  $oMongo = $oMongoDB->item;

  $oMongo->update(
  array('$or' => array(
                   array("identification.WKN" => "555750"),
                   array("identification.ISIN" => "DE005557504"),
                   array("identification.YAHOO" => "DTE.DE"),
                   array("identification.YAHOO" => "DTEGY"),
                   array("_id" => "lalala")
                 )
  ),
  array(
   '$set' => array(
      "shortname" => "DT_TELEKOM",
      "name" => array(
        "de" => "Deutsche Telekom AG",
        "en" => "Deutsche Telekom AG Inc."
      ),
      "type" => "STOCK",
      "web" => "http://deutschetelemom.com",
      "valid_from" => "1998-01-01",
      "valid_to" => "9999-12-31",
      "inactive" => false,
      "translate_all" => false,
      "is_provisory" => false,
      "touched" => "25.02.2013 17:11:54"
    ),
    '$addToSet' => array(
      "identification.WKN" => "555750",
      "identification.ISIN" => "DE005557504",
      "identification.YAHOO" => "DTE.DE",
      "identification.YAHOO" => "DTEGY"
    )
  ),
  array("upsert" => true)
);

//$oMongo->ensureIndex(array('$**' => "text"));
$oMongo->ensureIndex(array('$**' => "text"));

$result = $oMongoDB->command(
    array(
        'text' => 'item', //this is the name of the collection where we are searching
        'search' => 'DTEGY'
    )
);

print_r($result);

打印

[results] => Array
        (
            [0] => Array
                (
                    [score] => 1
                    [obj] => Array
                        (
                            [_id] => MongoId Object
                                (
                                    [$id] => 526e647b7ebd4252592cfe52
                                )

                            [identification] => Array
                                (
                                    [ISIN] => Array
                                        (
                                            [0] => DE005557504
                                        )

                                    [WKN] => Array
                                        (
                                            [0] => 555750
                                        )

                                    [YAHOO] => Array
                                        (
                                            [0] => DTEGY
                                        )

                                )

                            [inactive] =>
                            [is_provisory] =>
                            [name] => Array
                                (
                                    [de] => Deutsche Telekom AG
                                    [en] => Deutsche Telekom AG Inc.
                                )

                            [shortname] => DT_TELEKOM
                            [touched] => 25.02.2013 17:11:54
                            [translate_all] =>
                            [type] => STOCK
                            [valid_from] => 1998-01-01
                            [valid_to] => 9999-12-31
                            [web] => http://deutschetelemom.com
                        )

                )

        )

正如您所看到的,DTE.DE缺失了。

1 个答案:

答案 0 :(得分:0)

PHP中的关联数组每个键只能有一个条目。所以当你创建这样的PHP数组时:

array(
      "identification.WKN" => "555750",
      "identification.ISIN" => "DE005557504",
      "identification.YAHOO" => "DTE.DE",
      "identification.YAHOO" => "DTEGY"
)

第二次使用密钥"identification.YAHOO"时,它会替换数组中的第一个值。

幸运的是,MongoDB中的$addToSet运算符可以与$each - 运算符结合使用,它允许您为一个键传递一整个值,而不仅仅是一个键。我的PHP有点生疏,但这应该有效:

array(
      "identification.WKN" => "555750",
      "identification.ISIN" => "DE005557504",
      "identification.YAHOO" => array(
          "$each" => array("DTE.DE", "DTEGY")
      )
)