Запрос кросс-коллекции MongoDB с помощью 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", {})}})

В оболочке это работает, но я не могу сделать то же самое с помощью casbah, поскольку casbah, похоже, не поддерживает запросы с вызовом функции или локальной переменной.


person yakamoto    schedule 11.07.2013    source источник


Ответы (1)


Конечно, вы можете сделать это в 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"))
person Ross    schedule 11.07.2013
comment
Спасибо за ответ. Однако я решил избегать запросов между коллекциями, учитывая производительность, вместо этого я вставляю флаг в customer. Извините, что беспокою вас :Р - person yakamoto; 12.07.2013