2014-05-07 51 views
0

我正在編寫一些測試代碼來學習MongoDB的spring-data。我可以成功創建兩個Documents:Person和ADocument,其中ADocument包含對Person的引用。當用外鍵查詢時MongoDB的奇怪行爲

@Document 
public class Person { 

@Id 
private ObjectId id; 
@Indexed 
private String name; 

public ObjectId getId() { 
    return id; 
} 

public void setId(ObjectId id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 

} 

...

@Document 
public class ADocument { 

@Id 
private ObjectId id; 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

public String getText() { 
    return text; 
} 

public void setText(String text) { 
    this.text = text; 
} 

private String title; 
private String text; 

@DBRef 
private Person docperson; 


public Person getDocperson() { 
    return docperson; 
} 

public void setDocperson(Person docperson) { 
    this.docperson = docperson; 
} 

public ObjectId getId() { 
    return id; 
} 

public void setId(ObjectId id) { 
    this.id = id; 
} 

}

的問題出現了,當我試圖通過使用人的ID(一旦人的名字是讓所有的「adocuments」相關的人提供):

public List<ADocument> loadDocumentsByPersonName(String pname) { 
    Query qPerson = new Query().addCriteria(Criteria.where("name").is(pname)); 
    qPerson.fields().include("_id"); 
    Person pers = mongoTemplate.findOne(qPerson, Person.class); 
    ObjectId persId = pers.getId(); 
    Query qDoc = new Query().addCriteria(Criteria.where("person.$id").is(persId)); 
    System.out.println(qDoc.toString()); 
    List<ADocument> list2 = mongoTemplate.find(qDoc, ADocument.class); 
    return list2; 
} 

任何工作都很好,除了list2總是空的(雖然它不應該)。 的System.out.println(qDoc.toString())給出了類似:

查詢:{ 「$的人ID」:{ 「$ OID」: 「536a0d50e4b0d0c10297f2ab」}},字段:空,排序:空

如果我嘗試在蒙戈發出上面的查詢殼我得到如下:

db.adocument.find({ "person.$id" : { "$oid" : "536a0805e4b0af174d0b5871"}})

error: { 
"$err" : "Can't canonicalize query: BadValue unknown operator: $oid", 
"code" : 17287 
} 

而如果我鍵入

db.adocument.find({ "person.$id" : ObjectId("536a0805e4b0af174d0b5871")})

我實際上得到了一個結果!

我正在使用MongoDB 2.6.0和Spring Data 1.4.2。

我真的不知道發生了什麼...任何幫助都非常感謝!

+0

爲我使用相同的版本。我唯一需要改變的是屬性路徑,即:'Criteria.where(「docperson。$ id」)' –

+0

感謝您的回覆。對不起,有一個錯字:在我的代碼中我實際上寫了「docperson。$ id」,但它不起作用。 Java代碼沒有結果,並且在mongodb shell中出現此錯誤:> db.adocument.find({「docperson。$ id」:{「$ oid」:「536b3701e4b023786036ebda」}}) 錯誤:{ \t「$ err」 :「不能canonicalize查詢:BadValue未知的操作符:$ oid」, \t「code」:17287 – maryter

回答

0

我明白了! 出於某種原因,我不得不在顯示查詢中的集合名稱: List list2 = mongoTemplate.find(qDoc,ADocument.class,COLLECTION_NAME); 其中COLLECTION_NAME =「adocument」。

至於shell的行爲,似乎Query.toString()永遠不會返回正確的語法來剪切和粘貼以執行shell。