1. 程式人生 > >關於php查詢mongodb限制返回字段的問題

關於php查詢mongodb限制返回字段的問題

指定 con c排序 參數數組 skip 測試結果 要去 ret string

最近想做一個前端控制接口字段返回的一個基礎方法,通過mongodb 的find($query,$field)查詢來規定查詢的字段,但是遇到這麽一個問題:

工作代碼中有兩個封裝方法 :

/**
* 查詢一條記錄
* @param string 集合名
* @param array 查詢條件
* @param array 需要返回的字段
* @return array 查詢的結果
*/
public function find_one($coll_name, $condition = array(), $ret_fields = array(‘_id‘ => 0)) {
return $this->docsdb->find_one($coll_name, $condition, $ret_fields);
}

/**
* 查詢
* @param string 集合名
* @param array 查詢的條件array<br/>如<i>array(col_a=>111)</i>
* @param array 集合過濾器array<br/>完整的樣子想這個:<i>array(sort=>array(col_a=>1,col_b=>-1), skip=>100, limit=>10, timeout=>5000, immortal=>true)</i>,這表示:
* <ol>
* <li>wrapped 以wrapped為封裝為數組的鍵,默認按數組先後順序</li>
* <li>_id,默認不返回數據帶有MongoID字段,如果指定了返回列的話也是一樣的效果</li>
* <li>sort 以col_a為ASC,col_b為DESC排序,可以多列組合</li>
* <li>skip 表示從101條記錄開始取數據,即跳過了前100條</li>
* <li>limit 本次選取的條數</li>
* <li>timeout 表示等待響應的時間(暫不使用)</li>
* <li>immortal 表示是否維持鏈接永久有效,默認true,此時timeout失效(暫不使用)</li>
* </ol>
* @param array 需要返回的字段(通常只返回必要的字段可以加快響應速度)
* @return mixed 查詢的結果
*/
public function find($coll_name, $condition = array(), $result_filter = array(‘wrapped‘ => ‘‘, ‘with_objectId‘ => 0, ‘timeout‘ => 5000, ‘immortal‘ => true), $ret_fields = array()) {
return $this->docsdb->find($coll_name, $condition, $result_filter, $ret_fields);
}

**
 ‘with_objectId‘ => 0 已在傳入參數時設置為1
**
根據以上描述,$ret_fields就是mongodb find($query,$field)中的那個field,但是通過測試,我發現了這麽一個問題,如果我想要去顯示id,傳入參數數組
$ret_fields = array(
  ‘_id‘ => 1, 
‘account‘=> 1,
‘card‘ => 1
),
並調用find方法,根據理論來說,這個時候‘_id‘這個字段也是顯示的,並且我通過這個條件直接查詢mongodb,也是顯示的,但是打印出來的數據卻是不帶id的,數據如下:

{
"account": "qwe",
"card": ""
}

***補充個測試結果,如果find方法不傳入$ret_fields變量過去,即不限制返回字段的話,是存在‘_id‘的

通過修改條件,發現這個‘_id‘ => 1 這個條件寫不寫都沒用,於是我用相同的
$ret_fields去調用了find_one方法,這個時候竟然是返回‘_id‘字段的,數據如下

{
"_id": {
"$id": "58f472672430e11817000152"
},
"account": "qwe",
"card": ""
}

這個問題先記錄在這吧,以後解決了再記錄一下解決方法,如果有大神可以解釋下這個原因,請不吝賜教,謝謝!

關於php查詢mongodb限制返回字段的問題