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 байтов, которые потребуются для представления строки. Если вы хотите использовать DBRefs, я бы использовал ObjectId если указанная коллекция использует ObjectIdс для _id,

Вы не обязаны использовать ObjectId в DBRef. Это может быть любое значение, представляющее ключ (_id) соответствующей коллекции / БД.

Как следует из документации, если у вас нет веских причин для использования DBRefиспользуйте вместо этого ручные ссылки.

ObjectId Pros

  • в нем есть встроенная метка времени.

  • это тип по умолчанию Mongo _id; вездесущий

  • совместимость с другими приложениями и драйверами

ObjectId Минусы

  • это объект, и немного сложнее манипулировать на практике.

  • будут случаи, когда вы забудете обернуть строку в новый ObjectId()

  • для сохранения уникальности _id требуется создание объекта на стороне сервера.

  • что делает создание их на стороне клиента минимонго проблематичным

String Pros

  • разработчики могут создавать доменные _id топологии

Струны Минусы

  • разработчик должен обеспечить уникальность _ids

  • Запросы findAndModify() и getNextSequence() могут быть признаны недействительными

Другие вопросы по тегам