簡體   English   中英

php&mongodb:使用$ addToSet w / $ each

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM