2013-10-28 57 views
0

我正在玩mongodb(2.4.7 64位Linux操作系统)来弄清楚它是否会替代现有的mysql数据库。漂亮整洁是upsert功能 - 但我在这里有一个问题。有人可以解释为什么钥匙“identification.YAHOO”=>“DTE.DE”不会附加到数组,但会被“DETGY”相关吗?嵌入式阵列的upsert缺失值

<?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丢失。

回答

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

哦,对我很耻辱,我监督了不同数组键的事实......这工作相当好谢谢! '$ addToSet'=> array( “identification.WKN”=>“555750”, “identification.ISIN”=>“DE005557504”, “identification.YAHOO”=> array('$ each'=> array( “DTE.DE”,“DTEGY”)) ) – KIC