0

我是 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 的 Stitch)

4

2 回答 2

1

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

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

如果您想拥有更多的递归级别,请更改maxDepth. 此搜索会将结果文档放在otherDocs.

于 2018-09-27T18:36:42.110 回答
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,使用右上角的搜索栏。

于 2018-09-29T12:30:17.083 回答