2017-02-11 4 views
0

MongoDBを使ってMongooseを使ってネストされたプロパティの値に基づいてドキュメントを検索しようとしています。Mongooseの入れ子になったプロパティの照会(ドット表記なし)

var Obj = new mongoose.Schema({ 
    mainProperty: { 
     nestedProp1: String 
     nestedProp2:String 
    } 
}) 

データが受信されるため、ドット表記なしでクエリを実行する必要があります(下記参照)。

Obj.find({'mainProperty.nestedProp': 'value'}) 

上記のコードは正しい結果を得られますが、以下の形式でクエリ条件を渡す必要があります。

サーバー上でクエリを開発するのではなく、クライアント側から引数としてクエリオブジェクト全体を渡しています。サーバに当たる頃には、上記のコードが以下のように表示されます。

Obj.find(queryCondition) 
//queryCondition holds a value of { mainProperty: { nestedProp1: 'value' } } 

mainPropertyには2つのプロパティがネストされているため、上記の検索は実行できません。コロンに続いて渡されるものと正確に等しいmainPropertyを持つドキュメントを検索します(nestedProp1と等しい値を持ち、nestedProp2を持たないドキュメントを意味します)。

mainPropertyの値ではなくnestedProp1の値を照会する別の方法(ドット表記やオブジェクト自体を編集しない)を呼び出す方法はありますか?

答えて

0

あなたは、フィルタを指定しているのであれば、あなたは、フィルタリング、レコード、そうでない場合は、デフォルトのレコードを受け取ります

const filter = {}; 

// check if you have specified nestedProp1 
if (req.body.nestedProp1) { 
    filter['mainProperty.nestedProp1'] = req.body.nestedProp1; 
} 

if (req.body.nestedProp2) { 
    filter['mainProperty.nestedProp2'] = req.body.nestedProp2; 
} 

// and then 
Obj.find(filter); 

ような何かを行うことができ、があります。

私は、コードをテストしていないので、これが動作しない場合、あなたはあなたがマングースfind()で最もモンゴDB構文を使用することができますfilter['mainProperty']['nestedProp1'] = req.body.nestedProp1;

+0

ありがとう!これは小規模な例では間違いなく巧妙な方法ですが、実際のアプリケーションでは、8つのネストされていないプロパティと5つのネストされたプロパティがあります。さらに、毎回クエリに渡されるプロパティは異なります。私は大きなifステートメントを使用して、何が使用されているかを判断し、プロパティを変換することを避けることを望んでいます。私は質問をしたときに私はもっと多くの物件を持っていると指定しておき、助けに感謝します! –

0

をやってみることができます。これを試してみてください:返信用

Obj.find({ mainProperty: { nestedProp1: { $in: ['value'] } } })

Mongo docs

+0

答えをありがとうが、ドット表記法を使用しないことの背後にある目的は、すでにクエリがオブジェクトとして格納されていることです。私はオブジェクトを編集せずに照会することができるようにしたいと思います。$ inを使用すると、私はオブジェクトに入り、変更を加える必要があります。私は、要件についてより具体的に質問を更新します。 –

関連する問題