簡體   English   中英

基於mongodb查詢的過濾器集合

[英]filter collection based on mongodb query

我有一個要使用MongoDB輸出過濾的集合。 我的問題是,每個請求我都會收到一個無法用於過濾的承諾。 在繼續前進之前,如何解決所有未完成的承諾?

我當前的方法是使用lodash生成一個集合,將輸入作為鍵,將MongoDB輸出作為值( 此處描述的方法),通過公用鍵合並這兩個集合( 此處描述的方法),然后在新字段注釋為空時過濾條目。 當前它不起作用,因為在Mongodb請求期間未完成承諾。

非常感謝您的幫助。

注意:連接,架構和模型已經正確運行

import _ from 'lodash'
import Mongoose from 'mongoose';

Mongoose.Promise = global.Promise;

var input = [{'id':'1', 'text':'a'},{'id':'2', 'text':'b'},...]
var ids = _.map(input,'id')
var filtering = _.zipObject(ids, _.map(ids, function(id) {
  var query = Model.find({ id: id }).select({ comment: 1 });
  query.exec();
  return query
}));

// output is currently [{'id':'1','comment':Promise { <pending> },},{'id':'2','comment':Promise { <pending> },},...]
// output should be [{'id':'1','comment':'blabla',},{'id':'2','comment':'',},...]
var output= _({}).merge(_(input).groupBy("id").value(),_(filtering).groupBy("id").value())
  .values()
  .flatten()
  .value();
output = _.filter(output, 'comment')

貓鼬查詢異步響應,因此必須相應地處理它們的響應。

幸運的是, query.exec()返回一個promise,使您可以做到這一點。

var input = [{'id':'1', 'text':'a'}, {'id':'2', 'text':'b'}, ...];
var promises = input.map(function(dataObj) {
    return Model.find({ 'id': dataObj.id }).select({ comment: 1 }).exec()
    .then(function(comment) {
        return { 'id':dataObj.id, 'comment':comment };
    });
});
Promise.all(promises).then(function(results) {
    // do something with `results` (all that lodash stuff)
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM