2017-11-21 14 views
0

で$と$の正規表現を使用して:MongoDBのJavaクライアント、私はデータを照会するためにMongoDBのJavaクライアントを使用しています

<dependency> 
     <groupId>org.mongodb</groupId> 
     <artifactId>mongodb-driver</artifactId> 
     <version>3.5.0</version> 
    </dependency> 

サーバーのバージョンは3.4.10です。 MongoDBのシェルを使用する場合

、私は正常にクエリ使用することができます

db.c1.find(
    { title: { $in: [/test/,/demo/] } }, 
    { title:1 } 
) 

しかし、それは動作しませんJavaドライバを使用します。例:

List<String> keywords = new ArrayList<>(); 
keywords.add("/test/"); 
keywords.add("/demo/"); 
Document titleRegEx = new Document("$in", keywords); 

Document filter = new Document("title", titleRegEx); 

Document firstDoc = coll.find(filter).first(); 

logger.info("firstDoc: {}", firstDoc); 

私を助けてください。

答えて

0

プロファイル場合にMongoDBはMongoDBのに提出する次のフィルタを起こし...

List<String> keywords = new ArrayList<>(); 
keywords.add("/test/"); 
keywords.add("/demo/"); 
Document titleRegEx = new Document("$in", keywords); 

Document filter = new Document("title", titleRegEx); 

Document firstDoc = coll.find(filter).first(); 

...あなたは、これは 'ステートメントを見つける' ことがわかります呼び出します。

filter: { title: { $in: [ "/test/", "/demo/" ] } } } 

$inドキュメントの値に注意してください。 $in: [/test/,/demo/]の代わりに:$in: [ "/test/", "/demo/" ]です。したがって、正規表現マッチではなく、 "/ test /"と "/ demo /"の正確な文字列マッチングを実行しています。これはなぜこの 'findステートメント'が何も返さない理由を説明します。

そうのようなJavaドライバを使用するときは、正規表現検索を従事:

Filters.regex("title", "test") 

MongoDBのJavaドライバは、あなたがどのドキュメントを検索したい場合は、そう$inためBsonインスタンスのコレクションを供給することはできません。この 'in'リストのいずれかの要素に一致する:/test/, /demo/ORというクエリを作成する必要があります。たとえば:

find { find: "posts", filter: { $or: [ { title: /test/ }, { title: /demo/ } ] } } 

を。これは、機能的に同等です:プロファイル場合

Bson filter = Filters.or(Filters.regex("title", "test"), Filters.regex("title", "demo")); 

FindIterable<Document> documents = collection.find(filter); 

はMongoDBは、あなたが上記のコードは、MongoDBの上で実行されるように「ステートメントを見つける」は、次の原因となることがわかります呼び出しますあなたがあなたの質問に示したコマンドに。

+0

ご協力いただきありがとうございます。 – jiucai

関連する問題