2011-10-05 54 views
0

選擇從陣列獨特的領域我有一個MongoDB的結構,目前看起來是這樣的:使用MongoDB的

[campaigns] => Array (
    [0] => Array (
     [campaign_id] => 4e8cba7a0b7aabea08000006 
     [short_code] => IHEQnP 
     [users] => Array (
     ) 
    ) 
    [1] => Array (
     [campaign_id] => 4e8ccf7c0b7aabe508000007 
     [short_code] => QLU_IY 
     [users] => Array (
     ) 
    ) 
) 

我想做什麼就能做的,就是尋找短代碼,只是有相關數組返回。我最初嘗試:

db.users.find({'campaigns.short_code':'IHEQnP'}, {'campaigns.campaign_id':1}) 

然而,返回所有的陣列,而不是僅僅一個(或領域),我想要的。

是否有蒙戈的方式來得到正確的陣列(或偶數場與陣列相關)?或者是我在服務器上必須做的事情?我正在使用鋰框架來檢索結果(以防它有用)。

感謝提前:)

回答

1

當你使用一個標準像campaigns.short_code你還在尋找的收藏,活動只是一個文件的屬性,你發現返回文檔。 因此,給定這種結構,你不能直接通過查詢來實現你想要的。

陣列MongoDB中也可以切成片,但沒有排序:

db.users.find({}, {campaigns: { $slice : 1}}) 

這將使你的第一次競選,但你不能排序,使IHEQnP是在這種情況下,頂部沒有幫助其。 閱讀更多here

你可以檢索但完整的文檔後,過濾此鋰很簡單:

$id = 'id to match against'; 
$result = $user->campaigns->find(function($model) use ($id) { 
    return $model->campaign_id === $id 
}); 

實體文檔::找到here

我的解決辦法是,如果要保持它在用戶廣告系列的數量很少(只要文檔大小不太大,就可以在PHP中快速排序和過濾)。 如果這一預期增長,然後看它移動到自己的模型/收集或重新考慮你如何建模數據。

+0

感謝這個答案 - 我還沒有看到之前使用第二種方法並沒有意識到我能做的內部搜索這種方式;這真的很有用!我找到了另一種方法來構造數據並找到所需的數據(儘管在兩個數據庫調用中)。 我絕不會想到這些廣告活動中的每個用戶達到了100,但它是一個有點棘手使用MongoDB的於預期,或許應該已經使用MySQL的關係(如蒙戈我有多個重複數據相當多的情況下,楷模)。 再次感謝!肯定會檢查出第二種方法:) – Dan