2017-12-14 7 views
0

にパスを投入しますそのためeventからplaceを返し、そうでなければをconnectionから返してください。は条件付きで、私は次のスキーマを持っているモンゴクエリ

私は、単一の接続照会していたとき、私は現在、このような何かをやっている:

let c 
const execFunction = (err, connection) => { 
    if (connection.event) { 
    connection.place = connection.event.place 
    } 
    c = connection 
} 

const connectionPromise = Connection.findById(connectionId) 
connectionPromise.populate({ path: 'event', populate: { path: 'place' } }) 
connectionPromise.populate('place') 
connectionPromise.exec(execFunction) 

をしかし、私は置き換えを行うにはexecFunctionにコレクション全体を反復処理することを避けるためにしようとしています代わりにコレクションをクエリすると、個々の結果に論理があります。

これにアプローチする方が優れていますか?

+1

厳密に言えば、あなたが '.exec()'や '.then()'になるまでは、それは約束ではありません。それまでは、 'connectionPromise'は実際にはクエリです! #namingthings – joeytwiddle

+0

@joeytwiddleああ、それを指摘してくれてありがとう。 –

答えて

0

私が知る限り、モンゴースで条件付き集計を行う方法はありません。

あなたの場合、私はあなたが "深い人口"をしようとしていると思います。

ディープ母集団はサポートされていませんが、そのためのプラグインがあります。 'event'を暗示する必要があります。mongoose-deep-populate

const connectionQuery = Connection.findById(connectionId) 
connectionQuery.populate('place event event.place') 
connectionQuery.exec(execFunction); 

私は'place event.place'はおそらくそれを行うだろうことを推測しています。

placeまたはeventまたはが定義されていない場合、エラーは発生しません。単純に入力されません。

しかし、私はevent.placeが利用可能なときに、placeの人口をスキップする方法はありませんと考えています。ところで


あなたが約束を使用する場合、あなたはこのように書くことができます:ローカルでのエラーを処理するために

Connection.findById(connectionId) 
    .populate('place event event.place') 
    .then(onSuccessFunc) 
    .catch(onErrorFunc); 

:エラー、またはを伝播する

return Connection.findById(connectionId) 
    .populate('place event event.place') 
    .then(onSuccessFunc); 

。私はそれがすべての段階でif (err)を心配する必要がないので、コールバックよりも好ましいことがわかります。

関連する問題