Javascript MongoDB检索另一个文档中包含的每个文档';s数组

Javascript MongoDB检索另一个文档中包含的每个文档';s数组,javascript,mongodb,mongodb-stitch,Javascript,Mongodb,Mongodb Stitch,我是MongoDB的新手,所以这可能是一个基本问题,但我在如何解决这个问题上遇到了困难 我想在我的收藏中找到一个文档,如下所示: db.collection("articles").find({curid:"1000143"}).asArray(); 返回的字段之一是包含其他文档的“curid”(唯一值)的数组: 我要做的是找到其他每个文档,并将它们附加到已经存在的find查询结果中。我确信一定有一种方法不必对数组中的每个元素进行新的搜索 (如果有什么不同,我正在使用mongoDB Atlas

我是MongoDB的新手,所以这可能是一个基本问题,但我在如何解决这个问题上遇到了困难

我想在我的收藏中找到一个文档,如下所示:

db.collection("articles").find({curid:"1000143"}).asArray();
返回的字段之一是包含其他文档的“curid”(唯一值)的数组:

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


(如果有什么不同,我正在使用mongoDB Atlas的Stitch)

如果我正确理解了这个问题,您希望使用HDP_主题字段触发新的搜索。为此,您可以使用一个:

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

如果希望有更多的递归级别,请更改
maxDepth
。此搜索将把结果文档放在
其他文档下

这并不漂亮,但我看不到任何其他选择。所以这就是我最后为快速修复所做的。希望聚合功能(谢谢@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);
    }
 }
函数getDataByTitle(标题){ 试一试{ var deferred=$q.deferred(); var docs=db.collection(“articles”).find({title:title}).asArray()。然后( 文档=>{ var newData=[[docs[0]]; var docsLength=$rootScope.articlesToCompare; for(设i=1,p=Promise.resolve();i新承诺(解决=>{ newData.push(db.collection(“articles”).find({curid:docs[0].cosineArray[i]}).asArray(); 解决(); 如果(i==docsLength-1)延迟。解析(newData); })); } } ); 回报。承诺; }捕捉(错误){ 控制台日志(err); } } 注意:我从“HDP_主题”改为“CosNearray”。docsLength也是预定义的,它只是作为$limit的替代方案,因为我使用多个查询,所以无法在查询本身中定义它


结果是一个项目数组。使用右上角的搜索栏,您可以在此处看到它的实际操作。

这不起作用,因为您试图将HDP_主题用作“路径”(您告诉mongo使用当前文档的HDP_Topics属性,但这里不是这样。HDP_Topics将被视为变量,但该变量未定义,因此这将出错或不起作用(不确定是哪个)谢谢@ParthThakkar的更正,我更新了我的答案。谢谢你的回复,但是Stitch还不支持$graphLookup…这让事情变得…有趣。是的,我没有看到,抱歉。然后你就可以用递归函数来包装它了。这也给了你更多的控制权,如果这有什么安慰的话。
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);
    }
 }