2013-02-04 121 views
5

我對「如何獲得字段中的所有唯一值?」這個問題有很多回答。其中暗示了.distinct()方法。但是這會返回這些值的簡單數組。如何檢索具有唯一字段值的所有文檔?MongoDB查詢具有唯一字段的所有文檔

[{age: 21, name: 'bob'}, {age: 21, name: 'sally'}, {age: 30, name: 'Jim'}] 
Query for unique age --> 
[{age: 21, name: 'sally'}, {age: 30, name: 'Jim'}] 
or 
[{age: 21, name: 'bob'}, {age: 30, name: 'Jim'}] 

過濾查詢後的,其實不是一個理想的解決方案,因爲我仍然要選擇,$限制,$跳過如常。

+0

如果你們在'sally'和'bob'之間進行選擇,如果他們都有相同的年齡,你有什麼標準? –

+0

事實上,選擇兩個通常是「sally」的文檔的標準是什麼?你想要返回哪個文件? – Sammaye

+0

@RyanArtecona你已經預測了我的後續問題(如何指定過濾器)。對於我的特殊使用情況,我需要「最新」的記錄,但我不認爲有必要在這裏渾水,直到看到有人過濾。 – Sinetheta

回答

3
> db.foo.insert([{age: 21, name: 'bob'}, {age: 21, name: 'sally'}, {age: 30, name: 'Jim'}]) 
> db.foo.count() 
3 
> db.foo.aggregate({ $group: { _id: '$age', name: { $max: '$name' } } }).result 
[ 
    { 
     "_id" : 30, 
     "name" : "Jim" 
    }, 
    { 
     "_id" : 21, 
     "name" : "sally" 
    } 
] 
+1

那麼所有的文件都需要「重建」?如果還有其他屬性(例如:身高,體重),我們如何使用'$ max:'$ name''獲取整個記錄,而不是將最大名稱固定到分組$ age? – Sinetheta

+0

它就像一個SQL「GROUP BY」,那麼如果文檔有一個名爲'other_field'的字段,那麼你應該添加到你的'$ group'表達式,說明你想如何分組該字段。在我的示例中查看'name:{$ max:'$ name'}'表達式。 –

+1

這將給你一個不一定存在的人的信息:{{_id:30「,name:」ID爲30的人的最大姓名「,other_field:」來自ID爲30的人的最大other_field「}。 (在你編輯之前)。那麼使用$ max:'$ name'從記錄中獲得other_field的命令是什麼? – Sinetheta

相關問題