Предотвратить глубокую популяцию в схеме с круговыми ссылками

У меня есть следующая схема:

const Person= new Schema({

     father:   {
        type: Schema.Types.ObjectId,
        ref: "Person"
     },

     childs: [{
        type: Schema.Types.ObjectId,
        ref: "Person"
     }]
})


module.exports = mongoose.model("Person", Person)

Следующий шаг популярен. Я делаю это с пред find.

Person.pre('find', function(next){
    this.populate('father')
    this.populate('childs')
     return next()

}

Проблема возникает, когда у меня есть ребенок, указывающий на отца, и отец, указывающий на ребенка. Это вызывает круговую зависимость. Я пытался исключить некоторые поля в child таким образом this.populate('childs', '-father -childs'), но он все еще не работает.

Как я могу предотвратить такое глубокое заполнение?

ОБНОВЛЕНИЕ

В настоящее время я решаю проблему с помощью пользовательского интерфейса. Это со следующей процедурой:

  1. Пользователь запрашивает документ.
  2. Я делаю запрос на экспресс-сервер.
  3. Сервер отвечает мне незаполненным документом для этих полей.
  4. С клиента я проверяю конфликтующие поля и делаю новый запрос с ними на экспресс-сервер.
  5. Сервер отвечает мне одним или несколькими документами, не заполненными в конфликтующих полях.
  6. С новыми полученными документами я заменяю соответствующие поля конфликта и моделирую население.
  7. Я показываю информацию пользователю.

Любая попытка воспроизвести эту функцию, но на сервере express, заканчивается бесконечным циклом.

2
задан 27.11.2019, 17:50
1 ответ

DespuГ©s осведомления немного, я думаю, что она soluciГіn ты можешь получать ее в этапе $graphLookup из aggregate, которые ищут с перекурсивной формы до travГ©s одной colecciГіn.

Для твоего случая, tendrГ - в который консультация следующей формы осуществляться:

db.collection.aggregate([
  { $match: {  } }, // Filtra por los campos que necesites
  {
    $graphLookup: {
      from: 'person', // Colección ha relacionar
      startWith: '$father', // Empieza a buscar sobre esta propiedad
      connectFromField: 'child', // Campo a relacionar con 'connectToField'
      connectToField: '_id',  
      maxDepth: 1, // El numero de recursividad que quieres.
      as: 'data', // El campo donde se almacenara la información
    }
  }
])

после того, как смог показывать число глубины / возврата, ты не прибудешь в бесконечный цикл, который происходит с тобой.

переместил Тебя пару соединений, которые помогли мне понимать $graphLookup, который знал, что existГ - в, но никогда он не вышел у меня она ocasiГіn использования ее, и я думаю, что это хороший случай для этого.

API MongoDB

Хороший пример, чтобы понимать $graphLookup

Даже asГ, - если не смогло помогать тебе это, я жду, что ты какой-то идеи, чтобы это решать.

Приветствие

0
ответ дан 01.12.2019, 10:56

Теги

Похожие вопросы