2016-11-23 67 views
0

我有含有一种叫searchTerms场蒙戈文件。这是一个包含单词的数组。 [“字词1”,“词条2”,“TERM3”,“term4”]MongoDB的映射减少搜索条件

我想写一个由相关文档返回的功能。这意味着,与大多数文件查询的searchCriteria内术语第一,接着下一个最高的量方面等

实施例:

文件:

{"_id":"1", "searchTerms":["a","b","c","d"]} 
    {"_id":"2", "searchTerms":["a","b","x","q"]} 
    {"_id":"3", "searchTerms":["a","e","x","n"]} 
    {"_id":"4", "searchTerms":["e","f","g","z"]} 

对于搜索术语:[“一” ,“b”,“c”]结果应该是:

{"_id":"1", "searchTerms":["a","b","c","d"]} 
{"_id":"2", "searchTerms":["a","b","x","q"]} 
{"_id":"3", "searchTerms":["a","e","x","n"]} 

我已经写了一个函数来做到这一点,但它非常复杂,我认为效率低下。我在读有关地图减少和不知道它是否能在这种情况下帮助吗?我绞尽脑汁试图弄清楚如何做到这一点。我不确定它是否可以或不可以?如果是的话,有人可以告诉我它是如何工作的?

回答

1

一套简单的操作就足够了。使用$ setIntersection与输入数组进行比较,并使用相交数组的$ project $大小进行比较。 $按大小递减排序并投影最终响应。

aggregate([{ 
    "$project": { 
     "_id":0, 
     "fields" : "$$ROOT", 
     "matches": { 
      "$size": { 
       "$setIntersection": [ 
        "$searchTerms", ["a", "b"] 
       ] 
      } 
     } 
    } 
}, { 
    "$sort": { 
     "matches": -1 
    } 
}]) 
+0

嗨Veeram,哇谢谢你的回答太棒了!我没有意识到它可以被浓缩这么多...只是一对夫妇的问题。如果我想包含文档中的所有字段,是否需要在第一个$项目中特别包含全部内容?即“field1”:1,“field2”:1? –

+1

如果要包含所有字段,则可以在第一个项目中使用“字段”:$$ ROOT,但这也包含计算字段“匹配”。所以要么是$$ ROOT,要么你只需要在第一个项目中特别包含。 – Veeram

+0

Veeram我不能够感谢你!天才 –