使用casbah进行MongoDB交叉集合查询

时间:2013-07-11 07:56:28

标签: mongodb scala casbah

我有两个集合,如follwoing,

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", {})}})

在shell上可行,但我不能使用casbah,因为casbah似乎不支持使用函数调用或局部变量进行查询。

1 个答案:

答案 0 :(得分: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"))