嵌入式阵列的更新插入缺失值


missing value on upsert of an embedded array

我正在使用mongodb(2.4.7 64位Linux操作系统),以确定它是否是现有mysql数据库的绝佳替代品。更新插入功能非常整洁 - 但我在这里有一个问题。有人可以解释为什么关键"识别。雅虎" => "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。

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")
      )
)