1

前のクエリで返されたカーソルを次のクエリの$inの値として使用する方法はありますか?たとえば、次のようなものです。

var users = db.user.find({state:1})
var offers = db.offer.find({user:{$in:users}})

これにより、クライアントがユーザー情報をまったく必要とせず、提供するだけの場合に、mongodbとクライアント間のトラフィックを減らすことができると思います。私が間違っている?

4

2 に答える 2

0

基本的に、Mongoがサポートしていない2つのコレクションを結合したいとします。最初のクエリから返されるフィールドを、offersコレクションからデータを取得するために必要な一意のユーザー情報(つまり、_id)のみに制限することで、サーバーから転送されるデータの量を減らすことができます。

本当に1つのクエリを実行したいだけの場合は、offersコレクションにさらに多くの情報を保存する必要があります。たとえば、アクティブユーザー向けのオファーを検索しようとしている場合は、ユーザーのアクティブ状態をオファーコレクションに保存します。

于 2012-08-18T14:58:18.723 に答える
0

コメントから作業するには:

はい、それが質問で「参加」というタグを使用した理由です。アイデアは、参照以外の他のコレクションにユーザー データを格納することなく、一連のフィールドと正規表現を使用して最初のクエリをより複雑にすることができるということです。このような場合、常に 2 つの連続したクエリを実行する必要がありますが、最初のクエリの結果を転送する必要はありません。今できること、将来できること、または技術的な理由で実装できないことを理解したいだけです

私が理解している限り、これを可能にするために急いでいるわけではありません。また、atm のコーディング方法によって、カーソルの動作方法と定義方法が大幅に変更されます。他の人に実装の中断を引き起こす可能性があるほど大きな変更。safeこれは、将来のすべてのドライバーの挿入と更新を設定するかどうかの実際のケースです。これはデフォルトであるべきだと認識されていsafeますが、これは逆にそれを期待する他の人々の実装を壊します.

最初のクエリの結果をまったく必要としない場合はかなり非効率的ですが、ほとんどのネットワークは高トラフィックを念頭に置いて準備されており、トラフィックが安価であるため、チェーンクエリサーバーを実行できるようにする必要はありませんでした.カーソルの側。

ただし、副選択 (これは基本的に、前の行の副選択に基づいて行のセットを選択することです) は mongodb-user で数回行われており、役に立たない場合でもどこかに JIRA がある可能性もあります。作ること。

今それをすることに関して:方法はありません。

于 2012-08-18T19:27:51.267 に答える