2013-07-11 58 views
0

我有兩個集合像follwoing,MongoDB的交叉集合查詢與卡斯巴

customers: 
    {id: 1, name: "foo"} 
    {id: 2, name: "bar"} 
    {id: 3, name: "baz"} 

flags: 
    {cid: 1} 
    {cid: 3} 

然後檢索客戶,其標誌是

db.customers.find({id: {$in: db.flags.distinct("cid", {})}}) 

殼牌這個工作,但我不能做同樣使用casbah,因爲casbah似乎不支持使用函數調用或局部變量進行查詢。

回答

3

當然,你可以在casbah中做到這一點 - 記住db.flags.distinct返回一個迭代器,應該隱式地轉換爲一個列表以供在$in中使用。下面是一個測試例子:

import com.mongodb.casbah.Imports._ 
val db = MongoClient()("casbahTest") 
val customers = db("customers") 
val flags = db("flags") 

customers.drop() 
flags.drop() 

// Add some customers 
customers += MongoDBObject("_id" -> 1, "name" -> "foo") 
customers += MongoDBObject("_id" -> 2, "name" -> "bar") 
customers += MongoDBObject("_id" -> 3, "name" -> "baz") 

// Add some flags 
flags += MongoDBObject("cid" -> 1) 
flags += MongoDBObject("cid" -> 3) 


// Query 
// In JS: db.customers.find({id: {$in: db.flags.distinct("cid", {})}}) 

// Long hand: 
customers.find(MongoDBObject("_id" -> MongoDBObject("$in" -> flags.distinct("cid")))) 

// Using Casbahs query dsl to build the MongoDBObject: 
customers.find("_id" $in flags.distinct("cid")) 
+0

謝謝你的回覆。不過,我決定避免考慮性能的交叉收集查詢,而是將標誌嵌入到客戶中。我很抱歉打擾你:P – yakamoto