私は次のコレクションを持っています:
User {
firstname,
lastname
}
名または姓(名/姓/名+姓)でユーザーを検索したい。
私が持っているもの:
Criteria criteria = new Criteria();
criteria.orOperator(Criteria.where("firstname").regex(searchQuery),Criteria.where("lastname").regex(searchQuery));
上記の問題は、名または姓のいずれかで検索できますが、両方では検索できないことです(たとえば、「ジョン」または「スミス」は可能ですが、「ジョンスミス」は不可能です。これは、次の理由で発生しています。 orOperatorと私はandOrまたは類似のものを見ることができません。
たとえば、データベース内に「John Smith」がある場合、「John」、「Smith」、「JohnSmith」のいずれかをクエリすることで彼を見つけることができます(たとえば、Facebookの場合と同様)。
編集:
String queryx[] = searchQuery.split(" ");
for(String q : queryx) {
criteria.orOperator(Criteria.where("firstname").regex(searchQuery),Criteria.where("lastname").regex(q));
}
結果を表示しますが、コンソール内で次のエラーが発生します。
Due to limitations of the com.mongodb.BasicDBObject, you can't add a second '$or' expression specified as '$or : [ { "firstname" : { "$regex" : "john smith"}} , { "lastname" : { "$regex" : "smith"}}]'. Criteria already contains '$or : [ { "firstname" : { "$regex" : "john smith"}} , { "lastname" : { "$regex" : "john"}}]'.
Edit2:
String queryx[] = searchQuery.split(" ");
ArrayList<Criteria> orOperators = new ArrayList<Criteria>();
for(String q : queryx) {
Criteria criteria = new Criteria();
criteria.orOperator(Criteria.where("firstname").regex(searchQuery),Criteria.where("lastname").regex(q));
orOperators.add(criteria);
}
Criteria [] orArray = orOperators.toArray(new Criteria[orOperators.size()]);
Criteria c = Criteria.where("firstname").regex(searchQuery);
c.orOperator(orArray);
Query query = new Query(c).limit(limit);
return mongoOperations.find(query, User.class);
編集3:
String queryx[] = searchQuery.split(" ");
ArrayList<Criteria> cr = new ArrayList<Criteria>();
for (String q : queryx) {
Criteria criteria = new Criteria();
criteria.orOperator(Criteria.where("firstname").regex(q),
Criteria.where("lastname").regex(q));
cr.add(criteria);
}
Query query = new Query();
for (Criteria cri : cr) {
query.addCriteria(cri); //this is the problem
}
return mongoOperations.find(query, User.class);
エラー:
Due to limitations of the com.mongodb.BasicDBObject, you can't add a second 'null' criteria. Query already contains '{ "$or" : [ { "firstname" : { "$regex" : "john smith"}} , { "lastname" : { "$regex" : "john"}}]}'.
名と姓を検索するには、次のように簡単に行うことができます。
String queryx[] = searchQuery.split(" ");
ArrayList<Criteria> cr = new ArrayList<Criteria>();
for (String q : queryx) {
Criteria fCriteria = Criteria.where("firstname").regex(q);
cr.add(fCriteria);
Criteria lCriteria = Criteria.where("lastname").regex(q);
cr.add(lCriteria);
}
Criteria c = cr.remove(0);
Criteria [] orArray = orOperators.toArray(new Criteria[orOperators.size()]);
c.orOperator(orArray);
query.addCriteria(c); //this is the problem
return mongoOperations.find(query, User.class);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加