MongoDB检索包含在另一个文档数组中的每个文档

时间:2018-09-27 18:30:52

标签: javascript mongodb mongodb-stitch

我是MongoDB的新手,所以这可能是一个基本问题,但是我在处理方法上遇到了麻烦。

我想在我的收藏夹中找到一个文档,就像这样:

db.collection("articles").find({curid:"1000143"}).asArray();

返回的字段之一是包含其他文档的“ curid”(唯一值)的数组:

HDP_Topics = ["1124516", "101388", "1031462", "1053284", "1077080", "1150760", "1092377", "1100194", "1103692", "1135134", "1134909", "1119820", "1000634", "1120316", "1000143"]

我要做的是查找其他所有文档,并将它们附加到已经存在的查找查询结果中。我敢肯定,有一种方法不必对数组中的每个元素进行新搜索。

(如果有任何区别,我正在使用mongoDB Atlas的针迹)

2 个答案:

答案 0 :(得分:1)

如果我正确理解了该问题,则要使用HDP_Topics字段触发新的搜索。您可以为此使用$graphLookup

db.articles.aggregate( [
   {
      $graphLookup: {
         from: "articles",
         startWith: "1000143",
         connectFromField: "HDP_Topics",
         connectToField: "curid",
         as: "otherDocs",
         maxDepth: 2
      }
   }
] )

如果要获得更高的递归级别,请更改maxDepth。此搜索会将生成的文档放在otherDocs下。

答案 1 :(得分:0)

这不是很漂亮,但是我看不到其他选择。因此,这就是我最终为快速修复所做的事情。希望聚合功能(感谢@enys)将很快实现。

function getDataByTitle(title){
    try{
      var deferred = $q.defer();
      var docs = db.collection("articles").find({title:title}).asArray().then(
        docs => {
          var newData = [[docs[0]]];
          var docsLength = $rootScope.articlesToCompare;
          for(let i=1, p = Promise.resolve(); i < docsLength; i++){
            p = p.then(_ => new Promise(resolve => {
                newData.push(db.collection("articles").find({curid:docs[0].cosineArray[i]}).asArray());
                resolve();
                if(i==docsLength-1) deferred.resolve(newData);
            }));
          }
        }
      );
      return deferred.promise;
    } catch(err) {
      console.log(err);
    }
 }

注意:我从“ HDP_Topics”更改为“ cosineArray”。另外docsLength是预定义的,它只能用作$ limit替代,因为我正在使用多个查询,所以无法在查询本身中定义它。

结果是一组文章数组。您可以在此处unitroll.me上使用右上角的搜索栏查看它的运行情况。