MongoDB извлекает каждый документ, содержащийся в массиве другого документа - PullRequest
0 голосов
/ 27 сентября 2018

Я новичок в 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 голосов
/ 29 сентября 2018

Это не красиво, но я не видел другой альтернативы.Так что это то, что я сделал в конце для быстрого исправления.Надеемся, что функции агрегации (спасибо @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 , используя панель поиска в правом верхнем углу.

0 голосов
/ 27 сентября 2018

Если я правильно понял вопрос, вы хотите использовать поле HDP_Topics для запуска нового поиска.Для этого вы можете использовать $ graphLookup :

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

Если вы хотите увеличить уровень рекурсии, измените maxDepth.Этот поиск поместит полученные документы под otherDocs.

...