2015-01-09 51 views
0

我有2個集合。在MongoDb上向後搜索

集「用戶」

{ 
     "_id" : ObjectId("54b00098e0fdb6634b1f54e6"), 
     "state" : "active", 
     "backends" : [ 
       DBRef("backends", ObjectId("54b001ebe0fd853df1c93419")), 
       DBRef("backends", ObjectId("54b00284e0fd853df1c9341b")) 
     ] 
} 

集「後端」

{ 
     "_id" : ObjectId("54b001ebe0fd853df1c93419"), 
     "state" : "running" 
} 

我想在後端的狀態爲「正在運行」的用戶後端的列表。 mongodb如何能像加入兩個表一樣執行此操作? 是從後端向後搜索還是有函數過濾器的方法?

我可以搜索這樣

db.users.find({"backends.$id" : "distring"}) 

但如果我要搜索後端對象中的狀況是什麼?喜歡。

db.users.find({"backends.$state" : "running"}) 

但是,它不起作用。

回答

0

MongoDB不支持連接,所以你需要在兩個步驟中做到這一點。在外殼:

var ids = db.backends.find({state: 'running'}, {_id: 1}).map(function(backend) { 
    return backend._id; 
}); 

var users = db.users.find({'backends.$id': {$in: ids}}).toArray(); 

在一個側面說明,你可能會更好過使用的純ObjectId而不是一個DBRefbackends數組元素,除非該數組中的id其實可以參考文檔的多個集合。