【问题标题】:MongoDB/Mongoose- How to use nested objects/documents or subdocumentsMongoDB/Mongoose-如何使用嵌套对象/文档或子文档
【发布时间】:2017-04-01 20:30:28
【问题描述】:

我正在使用 MongoDB、Mongoose、Node.js、Express.js 创建简单的 RestApi,其中将有多个用户,并且可以注册更多用户,并且用户集合(数据库)中的每个用户都有一个条目.我的 user Schema(users.js) 会像

var mongoSchema = mongoose.Schema;
var userSchema ={
    mobileno: {
        type:String
    },
    firstname: {
        type:String
    },
    lastname: {
        type:String
    },
    facebookid: {
        type:String
    },
    userimage: {
        type:String
    }
}
module.exports = mongoose.model('user', userSchema);

现在每个用户可以保存一个或多个产品如下

现在哪一个是最好的解决方案:

  1. 我应该使用单独的集合(产品集合与一个字段 喜欢手机号供参考)
  2. 或者我应该使用子文档还是嵌套对象

我个人的选择是第二个,但我是 MongoDB 和 Mongoose 环境的新手。请帮助我在用户架构中需要更改什么。

【问题讨论】:

标签: mongodb express mongoose nodes mongoose-schema


【解决方案1】:

你可以这样做:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var userSchema = new Schema{
  mobileno: {
    type:String
  },
  firstname: {
    type:String
  },
  lastname: {
    type:String
  },
  facebookid: {
    type:String
  },
  userimage: {
    type:String
  }
}

var productSchema = new Schema{
 _user:{type: Schema.ObjectId, ref: 'user'}
 prod_name: {
    type:String
 },
 prod_cost: {
    type:String
 }
}
module.exports = mongoose.model('user', userSchema);
module.exports = mongoose.model('products', productSchema);

您可以将用户引用到产品表(即,就像 mysql 中的联接)

并在获取配置文件时填充:

Models.products.find(criteria, projection, options).populate([
    {path: '_user', select: 'prod_name, prod_cost'},
]).exec(callback);

感谢和问候

【讨论】:

  • 这是正确的方法吗?因为它似乎与我想要的相反。
【解决方案2】:

通常首选第二个选项。 product 键的架构看起来像 -

products: [productname: String, productdesc: String, ]

但是,在某些情况下,创建单独的product 集合的第一个选项更有意义。如果集合依赖于某些外部资源并且本质上是相当动态的,则会发生这种情况。在这里你会发现在一个地方而不是很多地方更新更容易。在这种情况下,您可以拥有类似

的架构
products: [productSchema]

这里要获取产品详细信息,您需要进行$lookup 操作

【讨论】:

    【解决方案3】:

    我认为,更好的方法是另一种方式。

    • 将产品保存为一个集合,将用户保存为另一个集合。
    • 在产品集合中,保存用户的引用。

    如果需要,然后使用 populate() 在产品中填充用户。

    【讨论】:

    • 似乎是正确的方法,因为这正是我接到这个任务时想到的第一个想法。
    • 但是这种方法会变得冗长,因为当我删除任何用户时,我还需要通过运行单独的函数来删除其保存的产品,或者是否有任何级联删除之类的选项。
    • 是的。你有这个选项。请看stackoverflow.com/questions/30255638/…
    【解决方案4】:

    阅读现有堆栈溢出答案后,我认为以下方法是正确的。如果我错了,请建议或纠正我。

    var mongoose = require('mongoose');
    var Schema = mongoose.Schema;
    
    var productSchema = new Schema{
     prod_name: {
        type:String
     },
     prod_cost: {
        type:String
     }
    }
    
    var userSchema = new Schema{
      mobileno: {
        type:String
      },
      firstname: {
        type:String
      },
      lastname: {
        type:String
      },
      facebookid: {
        type:String
      },
      userimage: {
        type:String
      },
      products: [productSchema]
    }
    
    
    module.exports = mongoose.model('user', userSchema);
    module.exports = mongoose.model('products', productSchema);
    

    【讨论】:

      猜你喜欢
      • 2012-10-17
      • 2021-03-26
      • 2020-03-14
      • 2021-05-06
      • 2020-10-04
      • 1970-01-01
      • 2017-07-25
      • 2015-05-25
      相关资源
      最近更新 更多