我正在尝试使用node.js和mongoDB构建某种社交媒体应用。 我有“用户”的mongoose架构,当我在应用程序上呈现一些用户页面时,它还需要显示他的所有帖子/图像/朋友列表等...
现在我有一个用于' UserPost'的mongoose架构并且对于' Image',当我保存图像时,它有一个字段,用于保存上传它的用户的用户名,因此当我渲染用户页面时,它会找到他的所有图像。
这是我第一次与数据库打交道,所以我听说我可能不得不使用参考数据而不是嵌入数据。
有人可以解释我应该如何为我的应用程序组织数据模型?
答案 0 :(得分:0)
MongoDB是一个NoSql DBMS。这意味着,你不应该在数据字段之间创建引用,因为来自NoSql的性能将被终止:https://en.wikipedia.org/wiki/NoSQL
但是,如果你真的认为你需要参考,请查看:http://docs.mongodb.org/master/reference/database-references/
您可以通过_id引用mongoDB中的数据文档(例如,“Page”=>“createdBy”=“User”=>“_ id”)。
答案 1 :(得分:0)
这取决于您要嵌入的数据类型。 MongoDB根据您使用的存储引擎具有对象大小限制。因此,您应该预测或估计要嵌入的对象的大小。
在此处查看有关限制的更多信息:http://docs.mongodb.org/master/reference/limits/
在此处详细了解参考资料:http://docs.mongodb.org/master/reference/database-references/
答案 2 :(得分:0)
使用mongoose人口处理数据库引用非常小心
定义这样的模式:
var mongoose = require('mongoose')
, Schema = mongoose.Schema
var userSchema = Schema({
name : String,
posts : [{ type: Schema.Types.ObjectId, ref: 'Post' }]
});
var postSchema = Schema({
title : String,
images : [{ url: String, filename: String }]
});
var User = mongoose.model('User', userSchema);
var Post = mongoose.model('Post', postSchema);
根据mongoose population docs,您可以获取所有数据:
User.findOne().populate('posts').exec(function(error, user) {
console.log(user.posts) // there are populated posts objects inside array
})
不确定,使用单独的集合进行图片上传是个好主意,将它嵌入Post(或用户)中会更简单,但您可以随时为图片添加{ type: Schema.Types.ObjectId, ref: 'Image' }