2013-04-10 3 views
1

Я заметил, что для построения DBRef в mongodb можно использовать либо строку, либо идентификатор объекта. Напримерmongodb - Construct DBRef со строкой или ObjectId

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 s для _id.

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

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

0

ObjectId Доводы

  • он имеет встроенный метку времени в нем.

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

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

ObjectId Cons

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

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

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

  • что делает их генерации на стороне клиента с помощью minimongo проблематичные

Струнные Pros

  • разработчики могут создать домен специфические _ID топологий

Струнные Cons

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

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