MongoDB / Mongoose-如何使用嵌套对象/文档或子文档

时间:2016-11-18 04:35:48

标签: mongodb express mongoose nodes mongoose-schema

我正在使用MongoDB,Mongoose,Node.js,Express.js创建简单的RestApi,其中将有多个用户和更多用户可以注册,并且将在用户集合(数据库)中为每个用户创建一个条目。我的用户架构(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);

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

enter image description here

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

  1. 我应该使用单独的收集(产品集合与一个字段 喜欢手机没有参考)
  2. 或者我应该使用子文档还是嵌套对象
  3. 我个人的选择是第二个,但我是MongoDB和Mongoose环境中的新手。请帮助我改变用户架构。

4 个答案:

答案 0 :(得分: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);
  

您可以将用户引用到产品表(i,.e,就像在mysql中加入一样)

     

在获取个人资料时填充:

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

谢谢&此致

答案 1 :(得分:0)

通常优选第二种选择。 product键的架构看起来像 -

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

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

的架构
products: [productSchema]

为了获取产品详细信息,您需要执行$lookup操作

答案 2 :(得分:0)

我认为,更好的方法是其他方式。

  • 将产品另存为集合,将用户另存为另一个集合。
  • 在产品系列中,保存用户的参考。

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

答案 3 :(得分:0)

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

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);