2

次の Mongoose スキーマを検討してください。

new mongoose.Schema({
    attributes: [{
        key: { type: String, required: true },
        references: [{
            value: { type: String, required: true },
            reference: { type: mongoose.Schema.Types.ObjectId, required: true }
        }]
    }
});

このスキーマに従うドキュメントは次のようになります。

{
    attributes: [
        {
            key: 'age', references: [{ value: '35', reference: 298387adef... }]
        },
        {
            key: 'name', references: [{
                value: 'Joe', reference: 13564afde...,
                value: 'Joey', reference: 545675cdab...,
        }
        ...
    ]           
}

次の条件に従って属性を選択したいと思います: - キーはname、たとえば - キーnameを持つ属性には、値を持つ少なくとも 1 つの参照がありますJoe

理想的には、これらの条件の多くを AND チェーンにしたいと思います。たとえば、{'name': 'Joe'}{'age': '35'}.

そのマングースを行う方法が見つからないようです。次の Mongoose クエリを試してみましたが、良い結果は得られませんでした (偽陽性または偽陰性のいずれかが返されます)。

 // First query
 query.where('attributes.key', attribute.key);
 query.where('attributes.references.value', attribute.value);

 // Second
 query.and([{ 'attributes.key': attribute.key }, { 'attributes.$.references.value': attribute.value }]);

 // Third
 query.where('attributes', { 'key': attribute.key, 'references.value': { $in: [attribute.value] }});

では、どうすればいいですか?

4

1 に答える 1

2

複数の用語に一致する要素をelemMatch含むドキュメントを検索するために使用できます。attributes

query.elemMatch(attributes, { key: 'name', 'references.value': 'Joe' })

ただし、複数の呼び出しを連鎖させることはできないため、これらの複数の AND を使用する場合は、メソッド呼び出しを連鎖させる代わりにandelemMatchを使用してクエリ オブジェクトを明示的に構築する必要があります。$and$elemMatchQuery

于 2013-05-28T12:50:47.607 に答える