2012-06-05 3 views
2

특정 값을 포함하는 필드가있는 모든 개체를 쿼리하고 싶습니다. 예를 들어, 나는 두 개의 문서가 있습니다필드 이름없이 mongodb 쿼리

{"123": "apple", "217": "pear", "179": "orange"} 
{"831": "pear", "189": "grapes"} 

및 값 "사과"인 필드가 모든 개체를 좀하고 싶습니다,하지만 난 필드의 이름을 모른다. 이를 달성하기 위해 MongoDB에서 쿼리를 지정할 수 있습니까? 개체의 숫자 키는 자식 ID이며 개체의 값은 긴 GUID입니다.

답변

5

불행히도 MongoDB는 특정 값을 가진 모든 필드를 쿼리하는 방법을 지원하지 않습니다. 이 향상된 기능을 요청하는 기존 Jira 티켓이 있습니다 (https://jira.mongodb.org/browse/SERVER-1248). 의견을 말하고, 투표하거나, 그 티켓을 따르십시오.

그런데이 작업을 처리하는 일반적인 방법은 MongoDB 스키마를 변경하는 것입니다. 귀하의 예를 들어, 기존의 스키마 변경됩니다 :

{"123": "apple", "217": "pear", "179": "orange"} 
{"831": "pear", "189": "grapes"} 

을 그리고 당신은이 같은 구조 수 :이 작업을 완료하면

{ tags: [ 
     { cid: "123", value: "apple" }, 
     { cid: "217", value: "pear" }, 
     { cid: "179", value: "orange" }, 
     ] 
    } 
    { tags: [ 
     { cid: "831", value: "pear" }, 
     { cid: "189", value: "grapes" }, 
     ] 
    } 

, 모든 찾을 follwing을 쿼리를 수행 할 수 있습니다 원하는 문서 :

db.docs.find({'tags.value': "apple" }) 

참고이 스키마 색인 원래 스키마가되지 않는 'tags.cid'와 'tags.value'필드를, 당신을 수 있다는 것.

이 정보가 도움이되기를 바랍니다.

-william

0

모든 필드에서 전체 텍스트 색인을 사용할 수 있습니다.

use dbname 
db.collectionname.ensureIndex(
          { "$**": "text" }, 
          { name: "TextIndex" } 
         ) 

그런 다음 사용하여 검색

DB db = mongoClient.getDB("dbname"); 
DBCollection coll = db.getCollection("collectionname"); 
BasicDBObject query = new BasicDBObject(); 
      query.append("$text", new BasicDBObject("$search", searchstring)); 
      DBCursor cursor = coll.find(query);