2016-05-26 3 views
0
{_id:111, 
keywords:['cs','ee','se'] 
}, 

{_id:112, 
keywords:['cs','se','dd'] 
}, 

Как я могу получить отношение к ключевым словам? так:Как получить комбинации элементов в поле массива в MongoDB?

{item1:'cs',item2:'ee',count:1}, 
{item1:'cs',item2:'se',count:2}, 
{item1:'ee',item2:'se',count:1}, 
{item1:'cs',item2:'dd',count:1}, 
{item1:'se',item2:'dd',count:1}, 
+0

Вы, гей ng создать своего рода «декартово произведение»? если есть только 2 документа, которые не являются проблемой, но больший набор данных может превышать 16 МБ лимита документа – profesor79

+0

У меня есть ** 33 ** уникальные ключевые слова и ** 3000 + ** документы – youzipi

ответ

0

Если я правильно понял вас отношения с данного примера - этот запрос должен быть решение вашей проблемы:

db.collection.aggregate([{ 
      $unwind : "$keywords" 
     }, { 
      $lookup : { 
       from : "collection", 
       localField : "_id", 
       foreignField : "_id", 
       as : "items" 
      } 
     }, { 
      $unwind : "$items" 
     }, { 
      $unwind : "$items.keywords" 
     }, { 
      $redact : { 
       $cond : { 
        if : { 
         $cmp : ["$keywords", "$items.keywords"] 
        }, 
       then : "$$DESCEND", 
       else : "$$PRUNE" 
      } 
     } 
    }, { 
     $group : { 
      _id : { 
       k1 : "$keywords", 
       k2 : "$items.keywords", 
      }, 
      items : { 
       $sum : 0.5 
      } 
     } 
    }, { 
     $sort : { 
      "_id" : 1 
     } 
    }, { 
     $project : { 
      _id : 1, 
      items : 1, 
      a : { 
       $cond : { 
        if : { 
         $eq : [{ 
           $cmp : ["$_id.k1", "$_id.k2"] 
          }, 1] 
        }, 
       then : "$_id.k2", 
       else : "$_id.k1" 
      } 
     }, 
     b : { 
      $cond : { 
       if : { 
        $eq : [{ 
          $cmp : ["$_id.k1", "$_id.k2"] 
         }, -1] 
       }, 
      then : "$_id.k2", 
      else : "$_id.k1" 
     } 
    }, 

} 
}, { 
    $group : { 
     _id : { 
      k1 : "$a", 
      k2 : "$b", 
     }, 
     items : { 
      $sum : "$items" 
     } 
    } 
}, { 
    $project : { 
     _id : 0, 
     item1 : "$_id.k1", 
     item2 : "$_id.k2", 
     count : "$items" 
    } 
} 
]) 

выход

{ 
    "item1" : "cs", 
    "item2" : "dd", 
    "count" : 1.0 
} 
{ 
    "item1" : "cs", 
    "item2" : "ee", 
    "count" : 1.0 
} 
{ 
    "item1" : "cs", 
    "item2" : "se", 
    "count" : 2.0 
} 
{ 
    "item1" : "dd", 
    "item2" : "se", 
    "count" : 1.0 
} 
{ 
    "item1" : "ee", 
    "item2" : "se", 
    "count" : 1.0 
} 
+0

это сработало.thx. и хороший пример для меня. – youzipi

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