mongodb - создает DBRef со строкой или ObjectId
Я заметил, что либо строка, либо идентификатор объекта могут быть использованы для создания DBRef
в mongodb. Например
db.persons.insert({name: 'alice'})
db.persons.find()
// { "_id" : ObjectId("5165419064fada69cef33ea2"), "name" : "alice" }
db.persons.insert({name: 'bob', sister: new DBRef('persons', '5165419064fada69cef33ea2')}) // use a string
db.persons.find()
// { "_id" : ObjectId("5165419064fada69cef33ea2"), "name" : "alice" }
// { "_id" : ObjectId("516541c064fada69cef33ea3"), "name" : "bob", "sister" : { "$ref" : "persons", "$id" : "5165419064fada69cef33ea2" } }
db.persons.insert({name: 'cavin', sister: new DBRef('persons', new ObjectId('5165419064fada69cef33ea2'))}) // use an ObjectId
db.persons.find()
// { "_id" : ObjectId("5165419064fada69cef33ea2"), "name" : "alice" }
// { "_id" : ObjectId("516541c064fada69cef33ea3"), "name" : "bob", "sister" : { "$ref" : "persons", "$id" : "5165419064fada69cef33ea2" } }
// { "_id" : ObjectId("516541e464fada69cef33ea4"), "name" : "cavin", "sister" : { "$ref" : "persons", "$id" : ObjectId("5165419064fada69cef33ea2") } }
Может кто-нибудь сказать мне, в чем разница и какой путь предпочтительнее?
2 ответа
Разница лишь в том, что на самом деле ObjectId
а другой является строковым представлением того, что выглядит как ObjectId
,
DBRef как ObjectId:
db.persons.insert({name: 'cavin',
sister: new DBRef('persons',
new ObjectId('5165419064fada69cef33ea2'))}) // use an ObjectId
DBRef как строка:
db.persons.insert({name: 'bob',
sister: new DBRef('persons',
'5165419064fada69cef33ea2')}) // use a string
В приведенном вами примере ObjectId
Форматирование может привести к более эффективному хранению, так как это 12-байтовое значение вместо 24 байтов, которые потребуются для представления строки. Если вы хотите использовать DBRef
s, я бы использовал ObjectId
если указанная коллекция использует ObjectId
с для _id
,
Вы не обязаны использовать ObjectId
в DBRef. Это может быть любое значение, представляющее ключ (_id
) соответствующей коллекции / БД.
Как следует из документации, если у вас нет веских причин для использования DBRef
используйте вместо этого ручные ссылки.
ObjectId Pros
в нем есть встроенная метка времени.
это тип по умолчанию Mongo _id; вездесущий
совместимость с другими приложениями и драйверами
ObjectId Минусы
это объект, и немного сложнее манипулировать на практике.
будут случаи, когда вы забудете обернуть строку в новый ObjectId()
для сохранения уникальности _id требуется создание объекта на стороне сервера.
что делает создание их на стороне клиента минимонго проблематичным
String Pros
- разработчики могут создавать доменные _id топологии
Струны Минусы
разработчик должен обеспечить уникальность _ids
Запросы findAndModify() и getNextSequence() могут быть признаны недействительными