2015-02-06 4 views
1

Я изучаю мангуст и нуждаюсь в некоторой помощи. У меня есть 3 коллекции, и по одному вызову API я хочу создать 3 документа, которые ссылаются друг на друга; "Присоединяется к" ниже:Mongoose: 3-сторонний документ, соединяющий

  • Пользователи - необходимость ссылки щебечет
  • Видео - необходимость ссылки щебечет
  • чирикает - нужно ссылаться на пользователей & щебечет

Вопрос: Я знаю, что Я могу сделать model.create() и передать новый документ в каждом обратном вызове, а затем обновить соответствующие документы, но мне было интересно, есть ли более чистый способ сделать это?

Извините, если я не понимаю вопроса. Пожалуйста, спросите меня, если что-то не имеет смысла.

Код

var chirpSchema = new mongoose.Schema({ 
    date_created: { type: Date, default: Date.now } 
    , content: { post : String } 
    , _video: { type: $oid, ref: "video" } 
    , _author: { type: $oid, ref: "user" } 
}); 
var chirp = mongoose.model('chirp', chirpSchema); 


var userSchema = new mongoose.Schema({ 
    date_joined: { type : Date, default: Date.now } 
    , cookie_id: String, 
    chirp_library: [{type: $oid, ref: "chirp"}] 
}) 
var user = mongoose.model('user', userSchema); 


var videoSchema = new mongoose.Schema({ 
    date_tagged: { type : Date, default: Date.now } 
    , thumbnail_url : String 
    , _chirps: [{type: $oid, ref: "chirp" }] 
}); 
var video = mongoose.model('video', videoSchema); 
+0

afaik, вы не можете делать ссылки в массиве, поэтому вы в основном сохраняете ссылку только на один '1' конец отношения «1-n» –

+0

Можете ли вы объяснить «сохранить ссылку только один» 1 'конец' 1- n 'отношения "? – dmr07

+0

У вас будет ссылка на видео и автора только в вашей схеме 'chirp'. Схемы 'user' и' video' не будут иметь его –

ответ

1

Монго и другие базы данных NoSQL не просто взаимозаменяемы альтернативы к базе данных SQL. Это заставляет вас переосмыслить свой дизайн по-другому. Концепция заключается не в определении отношения. Идея состоит в том, чтобы сделать информацию доступной в меньших запросах. Массивы, как правило, следует избегать в Монго, особенно если они могут расти бесконечно. Основываясь на вашем наименовании, это кажется сильной возможностью. Если вы сохраните остальную часть своей схемы и просто удалите эти два массива с ваших пользовательских и видео схем:

chirp.find({_author: yourUserId}).populate("_author") дает вам ту же информацию, что и user.findOne({_id: yourUserId}) в вашем текущем проекте.

аналогична,

chirp.find({_video: yourVideoId}).populate("_video") и video.findOne({_id: yourVideoId})

Единственная проблема с этим состоит в том, что .populate() работает на каждое чириканье вы тянущие. Этот способ заключается в денормализации некоторых (или всех) ваших авторских и видеодокументов в документе чирпа. Как я, скорее всего, дизайн это:

var chirpSchema = new mongoose.Schema({ 
    date_created: { type: Date, default: Date.now }, 
    content: { 
     post : String 
    }, 
    _author: { 
     _id: { type: $oid, ref: "video" }, 
     date_joined: { type: Date, default: Date.now } 
    }, 
    _video: { 
     _id: { type: $oid, ref: "user" }, 
     date_tagged: { type: Date, default: Date.now }, 
     thumbnail_url: String 
    } 
}); 

var userSchema = new mongoose.Schema({ 
    date_joined: { type : Date, default: Date.now } 
    , cookie_id: String 
}) 

var videoSchema = new mongoose.Schema({ 
    date_tagged: { type : Date, default: Date.now } 
    , thumbnail_url : String 
}); 

Это совершенно нормально иметь повторены данные, до тех пор, как это делает ваши запросы более эффективными. При этом вам нужно найти баланс между чтением и письмом. Если информация пользователя или видеоинформация изменяется регулярно, вам придется обновлять эти данные в каждом документе чирпа. Если на вашем видео/авторе, которое меняется регулярно, есть определенное поле, вы можете просто оставить это поле вне документа chirp, если это не обязательно в запросах.