Как создать схему mongoDb для вложенного документа - PullRequest
2 голосов
/ 26 мая 2020

У меня есть документ, подобный приведенному ниже. Здесь peoples содержит массив ObjectId, который указывает на коллекцию пользователей. И поле contribution содержит столько же поддокументов, сколько поле peoples. Длина является переменной, например, если у некоторой группы есть 2 ObjectId в people, тогда contribution будет иметь 2 вложенных документа. Для этого мне нужно создать схему mongoDb, пожалуйста, сообщите мне схему для этого.

{
   name: "person name",
   _id: ObjectId(""),
   creater: ObjectId("1"), //referencing to user collection
   peoples: [ObjectId("1"), ObjectId("2"),...upto n], //all referencing to user table
   contribution: {
                  ObjectId("1"):{
                                paid: 1200,
                                due: 1000,
                                prevDue: 200,
                                Advance: 0
                               },
                  ObjectId("2"):{
                                paid: 1200,
                                due: 1000,
                                prevDue: 200,
                                Advance: 0
                               },
                  //upto end of lists in peoples array
                 },
  estimated: 30000,
  collected: 15379,
  left: 14721
}

Ответы [ 3 ]

3 голосов
/ 07 июня 2020

Вам просто нужно сослаться на вложенную схему в вашем основном schema. Например:

let user = new Schema({
  name: String
})

let schema = new Schema({
  followers: [user]
})

В поле followers в schema вы только что сослались на схему user. Всякий раз, когда делается такая ссылка, типы nested schema вводятся в опорную точку.

2 голосов
/ 03 июня 2020

Вот реализация. Обратите внимание, что я определил свойство contribution как массив peopleContributionSchema. Это упрощает доступ к данным коллекции, так как вы можете oop для элементов в этом массиве. Способ, которым вы реализовали, не является гибким, поскольку ObjectId является свойством вклада, поэтому вам нужно будет заранее знать количество людей в взносе.

var peopleContributionSchema = new Schema({
    _id: Schema.Types.ObjectId,
    paid: Number,
    due: Number,
    prevDue: Number,
    advance: Number
});

var parentSchema = new Schema({
    _id: Schema.Types.ObjectId, // not necessary to define. Mongoose will add by default
    name: String,
    creater: Schema.Types.ObjectId,
    peoples: [Schema.Types.ObjectId],
    contribution: [peopleContributionSchema],
    estimated: Number,
    collected: Number,
    left: Number
});
1 голос
/ 05 июня 2020

Я понял, что вы хотите сделать, но вы не можете выполнить итерацию объекта схемы, например, с номером серии.
Схема объекта в MongoDB похожа на пару ключ-значение в JSON Object, вы не можете повторять ее, как al oop. Вместо этого подход для этого состоит в том, чтобы определить две разные схемы и назначить одну схему в массиве, чтобы использовать ее в другой схеме в качестве подсхемы.

Следуйте указанному ниже коду:

{
       name: "person name",
       _id: ObjectId(""),
       creater: ObjectId[1], 
       peoples: [ObjectId[0], ObjectId[1],...upto n-1],
       ObjectId: [
                   {
                     paid: 1200,
                     due: 1000,
                     prevDue: 200,
                     Advance: 0
                   },
                   {
                     paid: 1200,
                     due: 1000,
                     prevDue: 200,
                     Advance: 0
                   }
                 ],
      estimated: 30000,
      collected: 15379,
      left: 14721
}
...