【问题标题】:Strange behaviour of MongoDB when querying by foreign key通过外键查询时MongoDB的奇怪行为
【发布时间】:2014-05-07 11:48:38
【问题描述】:

我正在编写一些测试代码来学习使用 MongoDB 的 spring-data。我可以成功创建两个文档:Person 和 ADocument,其中 ADocument 包含对 Person 的引用。

@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()) 给出类似:

查询:{“person.$id”:{“$oid”:“536a0d50e4b0d0c10297f2ab”}},字段:null,排序:null

如果我尝试在 Mongo shell 上发出上述查询,我​​会得到以下信息:

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”}})错误:{“$err”:“可以't canonicalize query: BadValue unknown operator: $oid", "code" : 17287

标签: java spring mongodb


【解决方案1】:

我明白了! 出于某种原因,我不得不在查询中明确显示集合名称: 列表 list2 = mongoTemplate.find(qDoc, ADocument.class, COLLECTION_NAME); 其中 COLLECTION_NAME="adocument"。

至于 shell 的行为,Query.toString() 似乎永远不会返回正确的语法以进行剪切和粘贴以执行 shell。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-15
    • 2016-02-24
    • 2010-11-26
    • 2012-09-24
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多