2013-11-21 58 views
6

因此,我對MongoDB和文檔存儲的東西非常陌生。我很難找到最優雅高效的解決方案來執行以下操作:爲MongoDB和Node.js中的字段獲取所有值的最有效方法

我有一個名爲tests的集合。在每個測試中都有一個現場所有者的行爲。請看下圖:

{ 
"_id" : ObjectId("528c731a810761651c00000f"), 
"actions" : [ 
    { 
     "action" : "6784", 
     "owner" : "MERCHAND_1", 
     "_id" : ObjectId("528c7292810761651c00000e") 
    }, 
    { 
     "action" : "1", 
     "owner" : "MERCHAND_1", 
     "_id" : ObjectId("528c7292810761651c00000d") 
    }, 
    { 
     "action" : "1358", 
     "owner" : "MERCHAND_2", 
     "_id" : ObjectId("528c7292810761651c00000c") 
    } 
], 
"name" : "Test 1", 
"product" : ObjectId("528bc4b3a0f5430812000010") 

}

我怎麼能有如何使用Node.js & MongoDB的(我用的貓鼬驅動程序)的每個不同的所有者值的列表(陣列)。在mongoside或node.js端執行它會更好嗎?例如,如果我運行上表中的功能,它應該返回:

[ 
    { 
     "owner":"MERCHAND_1" 
    }, 
    { 
     "owner":"MERCHAND_2" 
    } 
] 

回答

7

您可以使用命令

db.runCommand({ 
    distinct: 'tests', 
    key: 'actions.owner' 
}); 

,讓你

{ 
    "values" : [ 
    "MERCHAND_1", 
    "MERCHAND_2" 
    ], 
    "stats" : {...}, 
    "ok" : 1 
} 

這將包括所有與MongoDB中做到這一點文件在tests集合。但是,如果您想檢查單個文檔,則可以重新編寫命令爲

db.runCommand({ 
    distinct: 'tests', 
    key: 'actions.owner', 
    query: { _id: ObjectId("528c731a810761651c00000f") } 
}); 
+0

謝謝,這是我需要知道的。 runCommand和直接調用不同的函數有什麼區別? –

+0

'db.collection.distinct()'方法提供'distinct'命令的包裝。它實際上是在後臺調用該命令,但不返回'stats'或'ok'屬性。 – Travis

11

MongoDB的支持distinct命令來做到這一點。在這種情況下,您可以使用點符號來定位數組中的字段。在外殼:

db.test.distinct('actions.owner') 

輸出:

[ 
    "MERCHAND_1", 
    "MERCHAND_2" 
] 
+0

哇,真是太酷了。謝謝。 –

相關問題