2014-09-10 6 views
7

난 그냥 경험했던 나는 여전히 대해 생각하고 무언가에 대한 그냥 빨리 질문에 $ 이유 :MongoDB를 : ObjectId가 배열

mongos> db.tickets.count({ "idReferenceList" : { "$in" : [ { "$oid" : "53f1f09f2cdcc8f339e5efa2"} , { "$oid" : "5409ae2e2cdc31c5aa0ce0a5"}]}}); 

0

mongos> db.tickets.count({ "idReferenceList" : { "$in" : [ ObjectId("53f1f09f2cdcc8f339e5efa2") , ObjectId("5409ae2e2cdc31c5aa0ce0a5")]}}); 

2

나는 $ oid와 ObjectId 철자 형식이 모두 MongoDB와 정확히 동일하다고 생각했습니다. 누구든지 왜 첫 번째 쿼리 반환 0 결과 및 두 번째 반환하는 2 (올바른 대답) 알고 있습니까?

또한 MongoDB Java 드라이버를 사용하여 MongoDB와 상호 작용하는 Morphia 프레임 워크를 사용하고 있습니다. 나는이 코드 줄을 실행하여 _ID되지 않은 분야에 걸쳐하며 Object 배열 연산자에 $로 검색하여 문제가 존재한다는 것을 깨달았다 :

List<ObjectId> fParams = new ArrayList<ObjectId>(); 

fParams.add(...); 

Query<Ticket> query = genericDAO.createQuery(); 

query.field("idReferenceList").in(fParams); 

result = genericDAO.find(query).asList(); 

미리 주셔서 대단히 감사합니다.

감사합니다,

  • 루이스 CAPPA
+1

genericDAO.find (쿼리) .asList(); //이 작업을 수행하고 확인할 수 있습니까? ? Wjat은 this.createQuery (필터)에서 사용중인 필터입니다. – BatScream

+0

죄송합니다. 오타가 잘못되었습니다. 이 'createQuery'메소드는 fParams리스트로 필터링하여 Query를 작성하는 내부 메소드입니다. 즉, genericDAO.Find (this.createQuery (filter))는 genericDAO.find (query)와 동일합니다. 미안합니다. – lcappa

답변

3

이 두 형식은 MongoDB를의 개체 ID의 올바른 표현은 문서에 따라,있다,

http://docs.mongodb.org/manual/reference/mongodb-extended-json/

그들이 표현 두 가지 모드에서 다르게,

따라서 objectid가 들어있는 필드를 조회하려면 쉘/콘솔 모드에서 ObjectId("<id>")을 사용해야합니다. mongo 쉘 모드에서 따라야 할 구문은 어느 것입니까?

따라서 쿼리 :

db.tickets.count({ "idReferenceList" : { "$in" : [ ObjectId("53f1f09f2cdcc8f339e5efa2") , ObjectId("5409ae2e2cdc31c5aa0ce0a5")]}}); 

는 행 수를 반환합니다.

이제

자바 API를 통해 그것을 할,

당신은 아래를 수행해야합니다

String[] ids = {"53f1f09f2cdcc8f339e5efa2","5409ae2e2cdc31c5aa0ce0a5"}; 
ObjectId[] objarray = new ObjectId[ids.length]; 

for(int i=0;i<ids.length;i++) 
{ 
    objarray[i] = new ObjectId(ids[i]); 
} 

BasicDBObject inQuery = new BasicDBObject("$in", objarray); 
BasicDBObject query = new BasicDBObject("idReferenceList", inQuery); 
DBCursor cursor = db.collection.find(query); 
while(cursor.hasNext()) 
{ 
    DBObject doc = cursor.next(); 
    // process the doc. 
} 
+0

것은 "_id"필드를 쿼리하는 것이 아니라 "idReferenceList"입니다.이 필드는 objectIds의 Array 필드 유형으로 정의 된 다른 필드입니다. 보시다시피, 작동하지 않습니다 ... – lcappa

+0

objectid 표현은 입력란에 관계없이 동일하게 유지됩니다. 내 대답이 업데이트됩니다. 방금 _id 필드에 대한 참조를주었습니다. – BatScream

+0

하지만 "$ oid"와 함께 작동하지 않습니다. 테스트 해 봤어? 쉘을 통해 두 개의 테스트 문서를 저장하고 직접 시도하십시오. 어쨌든 문제는 MongoDB Java 드라이버를 사용하고 있으며 직접 "ObjectId"쿼리 형식으로 직접 입력 할 수 없다는 것입니다. – lcappa