我是MongoDB的新手 - 来自关系数据库背景.我想设计一个带有一些注释的问题结构,但我不知道用于评论的关系:embed或者reference?
有一些注释的问题,比如stackoverflow,会有这样的结构:
Question
title = 'aaa'
content = bbb'
comments = ???
Run Code Online (Sandbox Code Playgroud)
首先,我想使用嵌入式注释(我认为embed在MongoDB中推荐),如下所示:
Question
title = 'aaa'
content = 'bbb'
comments = [ { content = 'xxx', createdAt = 'yyy'},
{ content = 'xxx', createdAt = 'yyy'},
{ content = 'xxx', createdAt = 'yyy'} ]
Run Code Online (Sandbox Code Playgroud)
很清楚,但我担心这种情况:如果我想编辑指定的评论,我该如何获取其内容及其问题?没有_id让我找到一个,也没有question_ref让我找到它的问题.(我是新手,我不知道如果没有_id和没有任何方法可以做到这一点question_ref.)
我必须用ref不embed?然后我必须创建一个新的评论集合?
如果您有子文档数组,Mongoose会自动为每个数组创建ID.例:
{
_id: "mainId"
subDocArray: [
{
_id: "unwantedId",
field: "value"
},
{
_id: "unwantedId",
field: "value"
}
]
}
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉Mongoose不为数组中的对象创建id?
背景
我正在从我们的RDBMS数据库到MongoDB的转换原型.在非规范化的过程中,似乎我有两个选择,一个导致许多(数百万)较小的文档,或者一个导致较少(数十万)大文档.
如果我可以将它提炼成一个简单的模拟,那么具有较少客户文档的集合(如Java)之间的区别是:
class Customer {
private String name;
private Address address;
// each CreditCard has hundreds of Payment instances
private Set<CreditCard> creditCards;
}
或者包含许多许多付款文件的集合,如下所示:
class Payment {
private Customer customer;
private CreditCard creditCard;
private Date payDate;
private float payAmount;
}
问题
MongoDB是否设计为偏好许多很小的文档或更少的大文档?答案主要取决于我计划运行的查询吗?(即客户X有多少张信用卡?vs上个月所有客户支付的平均金额是多少?)
我已经环顾了很多,但我没有偶然发现任何可以帮助我回答我的问题的MongoDB架构最佳实践.
我正在尝试编写一个跟踪脚本,但我无法弄清楚数据库应该如何工作.
在MySQL中,我创建了一个类似于的表
User:
username_name: string
Campaign:
title: string
description: string
link: string
UserCampaign:
user_id: integer
camp_id: integer
Click:
os: text
referer: text
camp_id: integer
user_id: integer
Run Code Online (Sandbox Code Playgroud)
我需要能够:
如果我按照自己的方式做点什么的话
User {
Campaigns: [
{
Clicks: []
}
]
}
Run Code Online (Sandbox Code Playgroud)
我遇到两个问题:
架构(子文档)中的嵌套架构与创建两个单独的模型并引用它们之间有什么区别,它们的性能如何?
子文档:
const postSchema = new Schema({
title: String,
content: String
});
const userSchema = new Schema({
name: String,
posts: [postSchema]
});
module.export = mongoose.model('User', userSchema);
Run Code Online (Sandbox Code Playgroud)
嵌套模型(按引用填充):
const postSchema = new Schema({
title: String,
content: String,
author: { type: String, ref: 'User' }
});
module.export = mongoose.model('Post', postSchema);
const userSchema = new Schema({
name: String,
posts: [{ type: Schema.Types.ObjectId, ref: 'Post'}]
});
module.export = mongoose.model('User', userSchema);
Run Code Online (Sandbox Code Playgroud)
编辑:这不是一个重复的问题.
在这个问题中:Mongoose子文档与嵌套模式 - mongoose子文档和嵌套模式完全相同.但是嵌套模型在数据库中创建单独的集合.我的问题是嵌套模式与嵌套模型的差异是什么,而不是子文档与嵌套模式.
//这里是模型
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;
// Task schema
var taskSchema = mongoose.Schema({
tasktype : {type: String},
createdon : {type: Date, default: Date.now},
createdby : {type: Schema.Types.ObjectId,ref: 'User'},
visitedby : [{type: Schema.Types.ObjectId,ref: 'User'}],
taskinfo : [{ isactive:Boolean, taskobject:String, taskdetails:String, iscompleted:Boolean}]
});
module.exports = mongoose.model('Task', taskSchema);
Run Code Online (Sandbox Code Playgroud)
// 路线
var Task = require ('../models/task');
var User = require ('../models/user');
var config = require ('../../config');
module.exports = function(app, express) {
var api = express.Router();
api.post('/tasks', function …Run Code Online (Sandbox Code Playgroud)