2015-05-11 6 views
0

Выдаваемые предметы: [{ prop1 : "a", prop2 : "b" , prop3, "c",....},....] и узоры: [{ prop1 : "a", prop2 : "Any"},...]

Я хочу, чтобы создать запрос, чтобы найти все шаблоны, соответствующие данные элементы.

Полученный запрос имеет вид:

((A or B or C) AND (D or E or F) AND (G or H or J)) 
or 
((A or B or C) AND (D or E or F) AND (G or H or J)) 
or 
((A or B or C) AND (D or E or F) AND (G or H or J)) 
.... 

Я пытался построить DSL-форму, но я получаю неоднозначное неявную ошибку на INIT:

Может ли это обозначение использовать? Или как я могу реализовать это с помощью DBObject.Builder или MongoDbObjects?

Спасибо, Эли

import com.mongodb.casbah.query.Imports._ 

/* test data */ 
val thing1 = Map[String,String]("thing_type" -> "PC", "os"-> "Windows", "vendor"-> "lenova") 
val thing2 = Map[String,String]("thing_type" -> "Tablet", "os"-> "iOS", "vendor"-> "Apple") 
" 

val things_list = List(thing1, thing2) 
/* end test data */ 

val atts_for_search = List("thing_type", "os", "vendor") 
var pattern_query = $or()      // *causes a compilation error 
things_list.foreach (thing => { 
    var att_and_list = $and()    // *causes a compilation error 
    atts_for_search.foreach (att => { 
      att_and_list ++= $or(att $eq thing(att),att $exists false,att $eq "Any") 

    }) // foreach attribute 
    pattern_query ++= att_and_list 
}) 

ответ

0

В $or и $and части DSL требует проходимого и не может инициировано без одного - отсюда и ошибки компиляции.

Если вы можете просто задержать создание $and и $or частей запроса до тех пор, пока не построили проходимое это работает:

import com.mongodb.casbah.query.Imports._ 

/* test data */ 
val thing1 = Map[String,String]("thing_type" -> "PC", "os"-> "Windows", "vendor"-> "lenova") 
val thing2 = Map[String,String]("thing_type" -> "Tablet", "os"-> "iOS", "vendor"-> "Apple") 
val things_list = List(thing1, thing2) 
/* end test data */ 

val atts_for_search = List("thing_type", "os", "vendor") 
val ors = scala.collection.mutable.ListBuffer[DBObject]() 
things_list.foreach (thing => { 
    var ands = scala.collection.mutable.ListBuffer[DBObject]() 
    atts_for_search.foreach (att => { 
      ands += $or(att $eq thing(att),att $exists false,att $eq "Any") 

    }) // foreach attribute 
    ands += $and(ands) 
}) 
val pattern_query = $or(ors) 

Это возвращает следующий результат:

{"$or": [{ "$and": [{ "$or": [ { "thing_type" : "PC"} , { "thing_type" : { "$exists" : false}} , { "thing_type" : "Any"}]} , 
        { "$or": [ { "os" : "Windows"} , { "os" : { "$exists" : false}} , { "os" : "Any"}]} , 
        { "$or": [ { "vendor" : "lenova"} , { "vendor" : { "$exists" : false}} , { "vendor" : "Any"}]}]} , 
     { "$and": [{ "$or": [ { "thing_type" : "Tablet"} , { "thing_type" : { "$exists" : false}} , { "thing_type" : "Any"}]} , 
        { "$or": [ { "os" : "iOS"} , { "os" : { "$exists" : false}} , { "os" : "Any"}]} , 
        { "$or": [ { "vendor" : "Apple"} , { "vendor" : { "$exists" : false}} , { "vendor" : "Any"}]}]}]} 

 Смежные вопросы

  • Нет связанных вопросов^_^