2015-06-19 33 views
0

我試圖模擬天生使用Jenssegers雄辯模型Laravel一個MongoDB的查詢兩套MongoDB中的Laravel。而運營商的使用Jenssegers

該查詢是這一個:

db.getCollection('users').find({ 
    $and : [ 
     {$or : [ 
      { "user.gender" : "male"}, 
      {"user.location" : "NYC"} 
     ]}, 
     {$and : [ 
      {"user.name" : "User Name"}, 
      {"user.id" : "10143224362247922"} 
     ]} 
    ] 
}) 

它是兩組的AND,作爲所述第一組是一個或值,而第二組是另一個和值。

我使用下面的查詢:

$query = array(
    '$and' => array(
    '$or' => array(
     "user.gender" => "male", 
     "user.location" => "NYC", 
    ), 
    '$and' => array(
     "user.name" => "User Name", 
     "user.id" => "10143224362247922", 
    ), 
    ) 
); 

$cursor = User::raw()->find($query, array(
    "_id" => false, 
)); 

但我得到的錯誤:不能規範化查詢:BADVALUE,需要一個數組

我做錯了什麼?

回答

1

您的代表真正的數組PHP語法錯誤是在幾個地方在這裏,但主要是你自己已經不必要打結,因爲你的MongoDB的查詢語法的初步認識錯過了開頭有一些點。

雖然您的初始查詢確實有效,但您使用的$and操作都不是必需的,因爲除非另有說明,否則MongoDB查詢中的所有參數都被認爲是「隱式」操作。

因此可以更有效地寫爲:

db.getCollection('users').find({ 
    "$or" : [ 
     { "user.gender" : "male"}, 
     { "user.location" : "NYC"} 
    ], 
    "user.name" : "User Name", 
    "user.id" : "10143224362247922" 
}) 

或者在PHP語法像這樣:

$query = array(
    '$or' => array(
     array("user.gender" => "male"), 
     array("user.location" => "NYC") 
    ), 
    array("user.name" => "User Name"), 
    array("user.id" => "10143224362247922") 
); 

但是仍然有我的腦海裏有一個問題在這裏。如果您的意圖是在數組的單個元素中匹配這些屬性,那麼您的查詢不起作用。

匹配數組的方式適用於MongoDB的條件是該條件可以匹配任何數組元素的數組。這樣的條件可存在於所述陣列的物品,但不一定是所有的一個元件。

對於這種情況您使用$elemMatch基本上適用它自己的一組查詢條件,每個數組元素作爲測試。只有當滿足特定元素的所有條件是元素(因此文件)被認爲是一個匹配:

db.getCollection('users').find({ 
    "user": { 
     "$elemMatch": { 
      "$or": [ 
       { "gender" : "male"}, 
       { "location" : "NYC" } 
      ], 
      "name" : "User Name", 
      "id" : "10143224362247922" 
     } 
    } 
}) 

而對於PHP:

$query = array(
    'user' => array(
     '$elemMatch' => array(
      '$or' => array(
       array("gender" => "male"), 
       array("location" => "NYC") 
      ), 
      array("name" => "User Name"), 
      array("id" => "10143224362247922") 
     ) 
    ) 
); 

所以"dot notation"您使用的是對數組元素的「單個」條件罰款。但是,對於「多個」條件,請改用$elemMatch


而且對與此相關的,如果你有轉換的典型JSON語法的例子麻煩你找到與外殼的工作,那麼你可以隨時json_encode測試你的PHP結構。這至少向您展示了JSON序列化,以便您可以進行比較。也是一個體面的記錄工具,恕我直言,這是您在應用程序中調試的最佳方式。