Relaciones en mongoose

Como puedo relacionar colecciones embebidas? Ejemplo; supongamos que tenemos las colecciones A, B , C y que B esta embebida en A, pero a su ves quiero relacionar B con C.

'use strict'
/*
   Module dependencies
*/
import mongoose from 'mongoose'

const Schema = mongoose.Schema

export default () => {

  let B = new Schema({
    ...
  })

  let A = new Schema({
    B: [B] // embed schema
  }, { collection: 'A' })

  return mongoose.model('A', A)
}

Ahora en otro archivo es al que llamo C:

'use strict'
/*
  Module dependencies
*/
import mongoose from 'mongoose'

const Schema = mongoose.Schema

export default () => {
  let C = new Schema({
    B: {
      type: Schema.ObjectId,
      ref: 'B'
    }
  })
  return mongoose.model('C', C)
}
3
задан 12.09.2016, 22:47
2 ответа

Ты нуждаешься в том, чтобы создать ссылку используя объект Schema.ObjectId что является типом данных, использованным для идентификатора документа в MongoDB. Свойство ref покажи, где искать вышеупомянутого идентификатора.

В этом примере, давайте верить в схему EsquemaA чтобы создавать модель A у которого есть ссылка на модель B.

var EsquemaA = Schema({
  refB: {
    type: Schema.ObjectId,
    ref: 'B'
  }
});

var EsquemaB = Schema({
  refC: {
    type: Schema.ObjectId,
    ref: 'C'
  }
});

var EsquemaC = Schema({
  // ...
});

mongoose.model('A', EsquemaA);
mongoose.model('B', EsquemaB);
mongoose.model('C', EsquemaC);

В этом примере, поле RefB это ссылка на идентификатора модели B.

Сейчас, чтобы это снабжать ссылками, ты должен использовать объект, который он представляет в снабженный ссылками документ. В этом примере, у нас есть объект b что является документом типом B:

let b = new B();
b.save();

Сейчас, мы создаем документ a что типа A и мы ссылаемся на документ b в свойстве или поле refB:

let a = new A();
a.refB = b;
a.save();

Ввиду того, что одинокий ссылка на один ObjectID реального документа, Mongoose должен наполнять инстанцию A инстанцией B. Чтобы это делать ты должен говорить Mongoose, чтобы он наполнил объект A используя метод populate() когда он вернет документ.

Это уже зависит от тебя и не то, что ты спрашиваешь, но форма состоит в том, чтобы использовать метод find() чтобы заселять свойство refB, например:

A
  .find()
  .populate('refB')
  .exec(function(err, a) {
  ...
});
2
ответ дан 24.11.2019, 13:25
  • 1
    Я заношу в список, нет никакого различия, кроме менять var на let. –  toledano 12.09.2016, 20:35
  • 2
    Хуан Давид, пожалуйста продолжает gu и # 237; в пламя " C и # 243; mo создавать пример м и # 237; nimo, я завершаю и verificable" , чтобы издавать твой вопрос. Я использую абстрактные примеры, равно как ты, чтобы объяснять тебе концепции ген и # 233; богатые и он, где у тебя есть проблемы. Я рекомендую тебе, что использовал ты c и # 243; я говорю настоящий для того, чтобы он тебе казался м и # 225; s f и # 225; cil comprensi и # 243; n и soluci и # 243; n твоей проблемы. Tip: Где он сейчас говорит A, помести одну B, и где помести B одна C. –  toledano 12.09.2016, 21:55
  • 3
    Я только что издал, если то, что я хочу. –  Juan David Echeverry Rivera 12.09.2016, 22:45
  • 4
    спасибо. ca и # 237; в счете с твоим ответом как делать это.:) –  Juan David Echeverry Rivera 13.09.2016, 04:00

Я нашел способ это делать, большое спасибо всем. я оставляю соединение решения здесь: https://github.com/juandav/mongoose-relationships

1
ответ дан 24.11.2019, 13:25
  • 1
    я помогаю себя ответ @toledano, чтобы падать в счет, в котором почти солитер.:) –  Juan David Echeverry Rivera 13.09.2016, 03:59