2016-04-19 5 views
0

他のフィールドにもハード制約がある部分的なフィールドマッチングのためにregexを使って検索できる複数のフィールドを受け入れるクエリを構築しようとしています。

例:

コレクション: "プロジェクト"
必要情報:{propertyId: "ABC"、のclientId: "XYZ"}、検索する
フィールド:nameserviceType.namemanager.name

現在私はこのようなクエリを持っていますが、結果がない場合はすべての結果が返されますが、これは役に立ちません。

{ 
'$and': [ 
    { propertyId: '7sHGCHT4ns6z9j6BC' }, 
    { clientId: 'xyz' }, 
    { '$or': 
    [ 
     { name: /HVAC/gi }, 
     { 'serviceType.name': /HVAC/gi }, 
     { 'manager.name': /HVAC/gi } 
    ] 
    } 
] 
} 

これについての洞察は誰でもいただければ幸いです。

例ドキュメント:

{ 
    _id: "abc", 
    propertyId: "7sHGCHT4ns6z9j6BC", 
    clientId: "xyz" 
    name: "16.000.001", 
    serviceType: { 
    _id: "asdf", 
    name: "HVAC" 
    }, 
    manager: { 
    _id: "dfgh", 
    name: "Patrick Lewis", 
    } 
} 

期待される結果は文書のみ、次のキーのwherepropertyId=7sHGCHT4ns6z9j6BCAND 1少なくとも一つを見つけることです:name, serviceType.name, or manager.name、入力された文字列と一致し、この場合には、それはHVACだとあれば正規表現フィールドのどれも一致しない場合、何も返しません。

更新 問題はMongoDBを使用していたため、再起動後すべてが機能しました。スクリプト次

+0

より良い解決策のためのサンプル文書を投稿してください。 – Saleem

+0

@Saleem私は、より多くの洞察と詳細で質問を更新しました。 –

答えて

0

てみてください:上記の

db.collection.find({ 
$and:[ 
    {propertyId:"7sHGCHT4ns6z9j6BC"}, 
    { 
    $or:[ 
     {name: /HVAC/i}, 
     {"serviceType.name": /HVAC/i}, 
     {"manager.name": /HVAC/i} 
    ] 
    }] 
}) 

クエリは、ドキュメントやドキュメントが返されます場合にのみpropertyIdマッチと正規表現を希望nameserviceType.nameまたはmanager.nameマッチのいずれか。

+0

これは私が持っているものではなく、単に 'clientId'と' greedy(g) 'を除いていますか? –

+0

あなたは裁判官です:)通常、間違いは非常に小さいが発見するのは難しいです。 – Saleem

+0

ええ、これは私の質問が今のものと同じです。 {'serviceType.name':/ asasdf/gi}、 {'$ and':[{propertyId: '7sHGCHT4ns6z9j6BC'}、{'$ or': {name:/ asasdf/gi}、 { manager.name ':/ asasdf/gi} ]}} MongoDBを再起動した後、ランダムに作業を開始しました。あなたのために@ saleemありがとう! –