MongoDB - DBRef для DBObject
Использование Java ... не то чтобы это имело значение.
Возникла проблема и, возможно, это просто проблема дизайна.
Я назначаю поле "_id" всем своим документам, даже встроенным. У меня есть родительский документ (и коллекция для тех), который имеет встроенный документ
Итак, у меня есть что-то вроде:
{ "_id" : "49902cde5162504500b45c2c" ,
"name" : "MongoDB" ,
"type" : "database" ,
"count" : 1 ,
"info" : { "_id" : "49902cde5162504500b45c2y",
"x" : 203 ,
"y" : 102
}
}
Теперь я хочу иметь другой документ, который ссылается на мою "информацию" через DBRef
не хочу копию. Итак, я создаю DBRef
который указывает на коллекцию родительского документа и указывает _id как xxxx5c2y. Тем не менее, призывая fetch()
на DBRef
дает NULL.
Означает ли это, что DBRef
а также fetch()
работает только в полях "_id" записи коллекции верхнего уровня?
Я бы ожидал что fetch()
будет использовать все ключи: значения в фигурных скобках документа... но, возможно, это требует слишком много. Кто-нибудь знает?? Нет ли способа создать перекрестные ссылки на документы, кроме как на верхнем уровне?
Спасибо
1 ответ
Да, ваши ссылки DBRef _id должны быть на документы в вашей коллекции, а не на внедренные документы.
Если вы хотите найти встроенный документ, вам нужно сделать запрос на info._id
и вам необходимо добавить индекс для этого (для повышения производительности) ИЛИ вам нужно будет сохранить этот встроенный документ в коллекции и рассматривать встроенный документ как копию. Копирование нормально в MongoDB ... "один факт - одно место" здесь не применимо... при условии, что у вас есть какой-то способ обновить копию, когда основная изменится (возможная согласованность).
Кстати, в DBRef официальное руководство гласит: "Большинство разработчиков используют DBRef только в том случае, если коллекция может меняться с одного документа на другой. Если ваша ссылочная коллекция всегда будет одинаковой, ссылки, приведенные выше, более эффективны".
Кроме того, почему вы хотите сослаться info
в документе? Если бы это был массив, я мог бы понять, почему вы можете ссылаться на отдельные записи, но, поскольку в вашем примере это не массив, почему бы просто не ссылаться на содержащий документ по его _id?