如何为子文档创建 mongoDb 架构

Posted

技术标签:

【中文标题】如何为子文档创建 mongoDb 架构【英文标题】:How to create mongoDb schema for subdocument 【发布时间】: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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何为子文档创建 mongoDb 架构的主要内容,如果未能解决你的问题,请参考以下文章

如何替换mongodb文档中的子字符串

Kotlin 数据类:如何为嵌入式文档生成 MongoDB ObjectId

如何为 MongoDB 集合中的所有文档选择单个字段?

MongoDB:如何为集合中的每个文档设置一个等于另一个字段值的新字段[重复]

获取数组中每个索引的子文档元素计数并更新子文档键 - 数组中的子文档(IN MONGODB)

MongoDB复制集架构搭建