2013-05-29 7 views
2

ДокументовMongoDB найти пересечение массивов

order1.filter = ['tag1','tag2'] 
order2.filter = ['tag1','tag2','tag3'] 

хочет получить:

query ['tag1','tag2'] -> (only order1) 
query ['tag1','tag2','tag3'] -> (order1 and order2) 
query ['tag1','tag2','tag3','tag4', etc ] -> (order1 and order2) 

and 

query ['tag1','tag3'] -> (null) 
query ['tag2','tag3'] -> (null) 

Всех значения order.filter должно быть обязательно в массиве запросов

Как сделать Это? Пробовал директива $ все, $ в :(

+1

к сожалению, не могу понять, что вопрос о –

+0

я не понимаю, либо –

+2

возможный дубликат [Как проверить, если поле массива является частью.. другого массива в MongoDB?] (http://stackoverflow.com/questions/15635658/how-to-check-if-an-array-field-is-a-part -of-другой-массив-в-MongoDB) –

ответ

0

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

Я думаю, что это в основном a duplicate так корректировки, что код для полей, которые вы получите что-то вроде:

//sample documents: 
> db.docs.find({},{_id:0}) 
{ "order" : 1, "filter" : [ "t1", "t2" ] } 
{ "order" : 2, "filter" : [ "t1", "t2", "t3" ] } 
var tagArray = [ "t1", "t2" ]; // array to "match" 
db.docs.aggregate([ 
    { 
     "$project" : { 
      "order" : 1, 
      "filter" : 1, 
      "killFlag" : { 
       "$const" : [ 
        true, 
        false 
       ] 
      } 
     } 
    }, 
    { 
     "$unwind" : "$filter" 
    }, 
    { 
     "$unwind" : "$killFlag" 
    }, 
    { 
     "$match" : { 
      "$nor" : [ 
       { 
        "filter" : { 
         "$in" : tagArray 
        }, 
        "killFlag" : true 
       } 
      ] 
     } 
    }, 
    { 
     "$group" : { 
      "_id" : "$order", 
      "filter" : { 
       "$addToSet" : "$filter" 
      }, 
      "killFlag" : { 
       "$max" : "$killFlag" 
      } 
     } 
    }, 
    { 
     "$match" : { 
      "killFlag" : false 
     } 
    }, 
    { 
     "$project" : { 
      "_id" : 1, 
      "filter" : 1 
     } 
    } 
]); 
Смежные вопросы