【问题标题】:How to create mongoDb schema for subdocument如何为子文档创建 mongoDb 架构
【发布时间】:2020-09-12 16:07:32
【问题描述】:

我有如下文件。这里peoples 包含指向用户集合的ObjectId 数组。并且contribution 字段包含与peoples 字段一样多的子文档。长度是可变的,例如如果某个组在 people 中有 2 个 ObjectId,那么 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
}

【问题讨论】:

    标签: node.js mongodb mongoose-schema


    【解决方案1】:

    您只需要在您的主schema 中引用嵌套架构。例如:

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

    schemafollowers 字段中,您刚刚引用了user 架构。每当这种引用完成时,nested schema 的类型就会被注入到引用点中。

    【讨论】:

    • 抱歉,我拒绝了您最近的suggested edit。我(显然)对您提到的合法“Pacman”和另一个系统(称为“PackMan”)感到困惑。
    【解决方案2】:

    这是一个实现。请注意,我将contribution 属性定义为peopleContributionSchema 的数组。这使得集合数据更易于访问,因为您可以循环访问该数组中的项目。您实现的方式不灵活,因为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
    });
    

    【讨论】:

      【解决方案3】:

      我知道你想要做什么,但你不能迭代一个模式对象,比如一个'n' no of series。
      MongoDB 中的对象模式就像 JSON 对象中的键值对,您不能像循环一样对其进行迭代。相反,这样做的方法是定义两个不同的模式并在数组中分配一个模式以在另一个模式中将其用作子模式。

      按照下面提到的代码:

      {
             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
      }
      

      【讨论】:

        猜你喜欢
        • 2012-01-05
        • 2015-07-05
        • 2016-02-29
        • 1970-01-01
        • 2017-07-17
        • 1970-01-01
        • 2017-03-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多