【问题标题】:MongoDB retrieve every document contained in another document's arrayMongoDB 检索包含在另一个文档数组中的每个文档
【发布时间】:2018-09-29 20:30:17
【问题描述】:

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

【问题讨论】:

    标签: javascript mongodb mongodb-stitch


    【解决方案1】:

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

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

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

    【讨论】:

    • 这是行不通的,因为你试图使用 HDP_Topics 作为“路径”(你告诉 mongo 使用当前文档的 HDP_Topics 属性,但这不是这里发生的事情。HDP_Topics 将是被视为一个变量,但该变量没有定义,所以这会出错,或者不起作用(不确定是哪个)
    • 感谢@ParthThakkar 的更正,我更新了我的答案。
    • 感谢您的回复,但 Stitch 还不支持 $graphLookup ......这让事情变得......有趣。 docs.mongodb.com/stitch/mongodb/actions/collection.aggregate
    • 真的,我没看到,抱歉。然后你就剩下把它包装在一个递归函数中了。如果有任何安慰的话,这也给了你更多的控制权。
    【解决方案2】:

    它不漂亮,但我看不到任何其他选择。所以这就是我最终为快速修复所做的。希望聚合函数(感谢@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,使用右上角的搜索栏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      • 2016-06-28
      • 2012-01-19
      • 2017-06-17
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多