[英]php & mongodb: using $addToSet w/ $each
這個問題與我的問題非常相似: 是否可以檢查其中一個數組條目是否在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()')來查看插入的結果。
對於初學者,在1.3.0中不建議將布爾值作為第三個參數傳遞給MongoCollection :: update() 。 在下面的示例中,我將現在建議的$options
數組用作該方法的第三個也是最后一個參數。
您是否可以驗證示例中第78個數組元素的$each
鍵正好是這五個字符,並且不包含前導不可打印字符? 如果我在$each
chr(13)
加上chr(13)
(即換頁),MongoDB不會發現我在使用運算符,並且會很高興地將object參數添加到set / array中。
除此之外,我能重現上述內容的唯一方法是制作一個$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)
}
}
]
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.