0

したがって、Trait と Question という 2 つのコレクションがあります。特定のユーザーについて、ユーザーの特性を反復処理し、欠落している特性に対応するすべての質問を照会したいと考えています。

linq.From(missingTraits)
.ForEach(function(trait)
{
    match.$or.push({ "Trait": trait });
});

database.collection("Questions", function(err, collection)
{
    collection.find(match).limit(2).toArray(function(err, questions)
    {
        next(err, questions);
    });
});

これは機能しますが、Trait ドキュメント (Question ドキュメントにはありません) のフィールドでソートされたオブジェクトが返されるようにしたいと思います。

Traits
[
  { "Name": "Height", "Value": "73", "Importance": 15 },
  { "Name": "Weight", "Value": "230" "Importance": 10 },
  { "Name": "Age", "Value": "29", "Importance": 20 }
]

Questions
[
  { "Trait": "Height", "Text": "How tall are you?" },
  { "Trait": "Weight", "Text": "How much do you weight?" },
  { "Trait": "Age", "Text": "How old are you?" }
]

したがって、上記の例で、3 つの特性がすべて欠落している場合は、Age と height のみを (この順序で) 戻したいと思います。これを容易にするために、何らかの方法でクエリまたは一致オブジェクトを変更することは可能ですか?

ありがとうございました。

4

1 に答える 1

0

私があなたの質問を正しく理解していれば、最も重要な 2 つの特徴を見つけたいと思いますか? 配列が単にmissingTraits特徴の名前 ("Height"、"Weight"、"Age") である場合は、クエリを Questions コレクションに送信する前に、最も重要な 2 つを見つけるために Traits コレクションにクエリを実行する必要があります。

残念ながら、重要度に関する情報が存在する場所であるため、質問コレクションのクエリだけを変更しても、Traits コレクションを個別に呼び出さないと機能しません。

のようなクエリ

database.collection("Traits", function(err, collection)
{
    collection.find(match).sort({ Importance : -1 }).limit(2).toArray(function(err, traits)
    {
        // cache the traits to query the questions collection
    });
});

$or クエリに一致する 2 つの最も重要な Traits を取得します (すべての一致、Importance の降順で並べ替え、2 つに制限)。その後、これらの結果を使用して、質問コレクションを照会できます。

この場合、「Age」、「Height」の順にドキュメントを返すように Questions コレクションに指示するのは難しいため、Traits コレクションから返された特性の重要度の順序をキャッシュしてから、クエリの結果をソートすることをお勧めします。クライアント側の質問。

のドキュメントは次のsort()とおりです。

http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7Bsort%28%29%7D%7D

最後に 1 つ: Traits コレクションへのデータベース呼び出しを使用してデータを入力する場合、コレクションに 2 つ目の呼び出しを追加するのではなく、その呼び出しにロジックmissingTraitsを配置できるはずです。sort()

于 2012-09-21T15:33:30.773 に答える