我正在编写一些测试代码来学习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。
我真的不知道发生了什么...任何帮助都非常感谢!
为我使用相同的版本。我唯一需要改变的是属性路径,即:'Criteria.where(“docperson。$ id”)' –
感谢您的回复。对不起,有一个错字:在我的代码中我实际上写了“docperson。$ id”,但它不起作用。 Java代码没有结果,并且在mongodb shell中出现此错误:> db.adocument.find({“docperson。$ id”:{“$ oid”:“536b3701e4b023786036ebda”}}) 错误:{ \t“$ err” :“不能canonicalize查询:BadValue未知的操作符:$ oid”, \t“code”:17287 – maryter