0

これが可能かどうかはわかりませんが、ここに行きます。

次のようなテーブルを持つ MongoDB (アクセスに morphia を使用) があります (この例では単純化されていますが、概念は同じです)。

{name:"Product A", parts:[{sku:"W-01"},{sku:"Y-01", qty:2}]}
{name:"Product B", parts:[{sku:"X-02"},{sku:"W-02"}]}
{name:"Product C", parts:[{sku:"Z-01"}]}

ここで、sku が「Y」または「Z」で始まるパーツを含む製品を検索したいと考えています。上記のドキュメントの場合、1 番目と 3 番目が返されます。

私が想像できる1つの可能なクエリは次のようなものです:

{$or:[{"parts":{"$elemMatch":{sku:/Y.*/}}},{"parts":{"$elemMatch":{sku:/Z.*/}}}]}

これはクエリ配列 ["Y","Z"] をループする必要があります

これを行う他の方法はありますか?:)

4

1 に答える 1

1

正規表現の一致を行う代わりに、最初の文字を独自のサブキーに分割することもできます。

{
    name:"Product A", 
    parts: [
        { s: "W", ku: "W-01" },
        { s: "Y", ku: "Y-01", qty:2 }
    ]
}

それ以外の場合は、この正規表現の一致を単純に実行でき$elemMatchます。ここも必要ありません。

db.products.find( { "parts.sku: /^[YZ]/ } );

ただし$or、正規表現検索は、内部的に範囲クエリ ( Y <= x < Z) または ( Z <= x < [):

db.so.ensureIndex( { 'parts.sku': 1 } );
db.products.find( { $or: [
    { "parts.sku": /^Y/ },
    { "parts.sku": /^Z/ } 
] } );
于 2013-08-08T11:08:41.370 に答える