Передача 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>);
Другие вопросы по тегам