2013-07-25 34 views
0

這個問題很類似地雷:Is there a way to check if one of the array entries contains a sub-array in 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()')來查看插入的結果。

回答

0

對於初學者,在1.3.0中不推薦使用布爾值作爲第三個參數MongoCollection::update()。在下面的示例中,我使用現在建議的$options數組作爲該方法的第三個也是最後一個參數。

您能否驗證示例中第78個數組元素的$each鍵恰好是那5個字符,並且不包含前導非打印字符?如果我將$each作爲chr(13)(即表單提要)的前綴,那麼MongoDB不會接受我正在使用運算符並將愉快地將對象參數添加到set /數組。

除此之外,我可以複製上述的唯一方式是通過其中$each的值是一個對象各具特色的更新:

$c->update(
    ['_id'=>1], 
    ['$addToSet' => [ 
    'tags' => ['$each' => (object) [1,2,3,4,5]], 
    ]], 
    ['upsert' => true] 
); 

這導致以下被插入(使用蒙戈殼,所以我們可以數組和對象)之間進行區分:

{ 
    "_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) 
      } 
     } 
    ] 
}