我正在使用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缺失了。
答案 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")
)
)