【问题标题】:How to query (find) from multiple Mongo collections at once and combine results如何一次从多个 Mongo 集合中查询(查找)并组合结果
【发布时间】:2019-12-30 04:59:08
【问题描述】:

我想从多个相互没有关系的集合中获取结果。我正在创建一个搜索引擎,它将获取一个术语,传递到后端并对多个集合(书籍、作者、标签)进行查询/查找,并将它们组合成一个对象以返回。这些集合中的任何一个都没有外键关系,我只想找到与文本术语匹配的结果。

但是,我很难找到正确的解决方案。我用来执行查找查询的模型返回一个承诺,所以我想找到一种方法来正确检索,因为它是异步的。

我尝试了 Promise.all 方法,但最终失败并出现 500 错误,因为我知道我做错了。

router.post('/', (req, res, next) => {
   var results = {}, term = req.body.term;

   var authors = Authors.find().or([
                           {first_name: new RegExp(term, 'i')},
                           {last_name: new RegExp(term, 'i')}
                       ]);
   var books = Books.find().or([
                           {title: new RegExp(term, 'i')},
                           {author: new RegExp(term, 'i')},
                           {description: new RegExp(term, 'i')}
                       ]);
   var tags = Tags.find().or([
                           {name: new RegExp(term, 'i')}
                       ]);

   Promise.all([authors, books, tags])
       .then(results => res.send(results));        
});

我想从所有集合中获取结果,并能够将其组合成一个 JSON 对象。比如:

{
    books: {
          // results from Books collection
    },
    authors: {
          // results from Authors collection
    },
    tags: {
          // results from Tags collection
    },
}

【问题讨论】:

    标签: mongodb mongoose collections promise


    【解决方案1】:

    使用异步等待,理想情况下是发出 router.get 请求而不是 router.post

    router.get('/', async (req, res) => {
       let term = req.body.term;
    
       let authors = await Authors.find().or([
                           {first_name: new RegExp(term, 'i')},
                           {last_name: new RegExp(term, 'i')}
                       ]);
       let books = await Books.find().or([
                           {title: new RegExp(term, 'i')},
                           {author: new RegExp(term, 'i')},
                           {description: new RegExp(term, 'i')}
                       ]);
       let tags = await Tags.find().or([
                           {name: new RegExp(term, 'i')}
                       ]);
        let results = {
                       authors,
                       books,
                       tags
                      }  
    
         res.send(results));        
       });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 2013-09-06
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      相关资源
      最近更新 更多