Передача DBRef в запросе монго при получении документа с использованием Java
db.collectionB.findOne()
{
"_id" : NumberLong(24),
"class" : "Top",
"type" : DBRef("collectionA", NumberLong(47))
}
db.collectionA.findOne()
{
"_id" : NumberLong(47),
"name" : "John",
"position" : 2
}
Запрос должен быть сформирован: db.collectionB.find({type: DBRef("collectionA", NumberLong(47))});
В коллекции A & collectionB имеется ряд документов. Я хочу найти документы, где "тип" в collectionB ссылается на документ, где "_id" - это NumberLong (47) в collectionA.
BasicDBObject query = new BasicDBObject("name","John");
DBObject db_object = findOne("collectionA",query);
DBRef myDbRef = new DBRef(db,"collectionB",db_object);
DBObject doc = myDbRef.fetch();
System.out.println(doc);
Это дает выходной ноль. Зачем?
1 ответ
3-аргументный конструктор DBRef принимает следующие аргументы:
- База данных
- Пространство имен
- Я БЫ
Ваш второй аргумент не пространство имен, это просто коллекция. Это должна быть строка "yourDatabaseName.collectionB"
,
Ваш третий аргумент не просто идентификатор, это законченный объект. Таким образом, DBRef указывает на документ, где значение поля _id
является полной копией документа, который вы передаете. Такого документа не существует, поэтому выборка DBRef возвращает ноль.
Чтобы создать действительный DBRef, вам нужно только передать значение _id
конструктору DBRef
,
Но когда я понял ваше требование: "Я хочу найти документы, где" тип "в collectionB ссылается на документ, где"_id"- это NumberLong(47) в collectionA". правильно, вам даже не нужно запрашивать коллекцию. DBRef - это просто прозрачные подобъекты с такой структурой: { "$ref" : <value>, "$id" : <value>, "$db" : <value> }
, Таким образом, вы сможете найти нужные документы с помощью:
db.collectionB.find("type.$id": 47);
Это предполагает, что все dbref под type
ссылаться на ту же коллекцию и базу данных. Если это не так, вам нужно включить их в ваш запрос, чтобы избежать ссылок на другую коллекцию:
db.collectionB.find("type.$id": 47, "type.$ref": "collectionA", "type.$db": <database name>);