简体   繁体   中英

Strange behaviour of MongoDB when querying by foreign key

I am writing some test code to learn spring-data with MongoDB. I can successfully create two Documents: Person and ADocument, where ADocument contains a reference to 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;
}

}

The problem arises when I try to get all the 'adocuments' related to a person by using the person's ID (once the person's name is provided):

    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;
}

Everyting works fine except that list2 is always empty (while it shouldn't). System.out.println(qDoc.toString()) gives something like:

Query: { "person.$id" : { "$oid" : "536a0d50e4b0d0c10297f2ab"}}, Fields: null, Sort: null

If I try to issue the query above on the Mongo shell I get the following:

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

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

While if I type

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

I actually get a result!

I am using MongoDB 2.6.0 and Spring Data 1.4.2.

I really can't figure out what's going on... Any help is extremely appreciated!

I got it! For some reason, I had to explicit the collection name in the Query: List list2 = mongoTemplate.find(qDoc, ADocument.class, COLLECTION_NAME); where COLLECTION_NAME="adocument".

As for the shell behaviour, it seems that Query.toString() does never return a correct syntax to be cut and paste for shell execution.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM