【发布时间】:2015-01-10 10:54:08
【问题描述】:
我的主要问题是这个体系结构如何 - 如果用户在数据库中创建一个新列表并且有一个单独的集合用于存储列表,那么当他想要访问可以存储他的联系人的特定列表时我应该重定向他通过在数据库中为他分配一些集合,现在问题来了,如果有特定用户的“n”个列表用于通过根据他的需要分类到列表中来保存他的联系人,那么我应该如何实施这个架构有什么建议?还是我到目前为止所做的事情有误?任何更正?
我正在使用带有 express 框架的 mongodb、nodejs
到目前为止,我所做的是手动创建一个新列表并为其分配一个集合,以便用户可以在该列表中添加他的联系人。 但是为每个列表手动创建集合是不可能的,所以我正在寻找一种可以按需自动创建新集合的方法。
有什么方法可以在 mongodb 中创建 n 个集合或 n 个子集合吗?
这是我在集合中添加联系人的 js 文件,我将这些联系人存储在两个单独的列表中,每个列表都有单独的集合。
var express = require('express');
var router = express.Router();
var $ = require("jquery");
var mongoose = require('mongoose');
/* GET New User page. in list 1 */
router.get('/mylist', function(req, res) {
res.render('mylist', { title: 'Go To My-List' });
});
router.post('/delcontact', function(req, res){
console.log('Using delcontact');
var db = req.db;
var collection = db.get('golists');
console.log('Got this : ' + JSON.stringify(req.body));
var delcontact = req.body;
var emails = Object.keys(delcontact).map(function(k) { return delcontact[k] });
for(var z=0; z<emails.length; z++){
//console.log('email: \n' + emails[z]);
collection.remove({email: emails[z]},
function(err, doc, z) {
if (err)
res.send('delete unsuccessfull');
else {
console.log('Selected contacts deleted');
}
});
res.send({redirect: '/userlist2'});
var collection = db.get('golists');
};
});
/* POST to Add User Service */
router.post('/addusers', function(req, res) {
// Set our internal DB variable
var db = req.db;
// Get our form values. These rely on the "name" attributes
var firstName = req.body.firstname;
var lastName = req.body.lastname
var userEmail = req.body.useremail;
// Set our collection
var collection = db.get('golists');
// Submit to the DB
collection.insert({
"firstname" : firstName,
"lastname" : lastName,
"email" : userEmail
}, function (err, doc) {
if (err) {
// If it failed, return error
res.send("There was a problem adding the information to the database.");
}
else {
// If it worked, set the header so the address bar doesn't still say /adduser
res.location("mailinglist");
// And forward to success page
res.redirect("mailinglist");
}
});
});
/* GET Userlist page. */
router.get('/mailinglist', function(req, res) {
var db = req.db;
var collection = db.get('golists');
collection.find({},{},function(e,docs){
res.render('userlist2', {
"userlist2" : docs
});
});
});
/* this is for list 2 */
router.get('/mylist2', function(req, res) {
res.render('mylist2', { title: 'Go To My-List' });
});
router.post('/addusers2', function(req,res){
//Set our internal DB variable
var db = req.db;
// Get our form values. These rely on the "name" attributes
var firstName = req.body.firstname;
var lastName = req.body.lastname
var userEmail = req.body.useremail;
// Set our collection
var collection = db.get('golists2');
// Submit to the DB
collection.insert({
"firstname" : firstName,
"lastname" : lastName,
"email" : userEmail
}, function (err, doc) {
if (err) {
// If it failed, return error
res.send("There was a problem adding the information to the database.");
}
else {
// If it worked, set the header so the address bar doesn't still say /adduser
res.location("mailinglist2");
// And forward to success page
res.redirect("mailinglist2");
}
});
});
/* GET Userlist page. */
router.get('/mailinglist2', function(req, res) {
var db = req.db;
var collection = db.get('golists2');
collection.find({},{},function(e,docs){
res.render('mailinglist2', {
"mailinglist2" : docs
});
});
});
router.post('/delcontact2', function(req, res){
console.log('Using delcontact');
var db = req.db;
var collection = db.get('golists2');
console.log('Got this : ' + JSON.stringify(req.body));
var delcontact = req.body;
var emails = Object.keys(delcontact).map(function(k) { return delcontact[k] });
for(var z=0; z<emails.length; z++){
//console.log('email: \n' + emails[z]);
collection.remove({email: emails[z]},
function(err, doc, z) {
if (err)
res.send('delete unsuccessfull');
else {
console.log('Selected contacts deleted');
}
});
res.send({redirect: '/mailinglist2'});
var collection = db.get('golists2');
};
});
这是我在某些集合中创建新列表的文件
router.get('/newlist',function(req,res){
res.render("newlist" ,{titile:'Add new list'}) ;
});
router.post('/addlist',function(req,res){
var db= req.db;
var listname=req.body.listname;
var collection=db.get("lists");
collection.insert({
"listname":listname
}, function (err,doc) {
if(err) {
res.send("There was a problem adding new list to database");
}
else {
res.location('lou');
res.redirect('lou');
}
});
});
router.get('/lou',function(req,res){
var db=req.db;
var collection=db.get("lists");
collection.find({},{},function(e,docs){
res.render('lou', {
"lou" : docs
});
});
});
router.get('/drop', function(req, res) {
res.render('drop', { title: 'Go To My-List' });
});
我的玉文件是
body
nav.navbar.navbar-default
.container-fluid
ul.nav.navbar-nav
li.active
a(href='/mailinglist')
| List 1
span.sr-only (current)
|
li
a(href='/mailinglist2')
| List 2
tbody
ul
p Import Contact From Your DB
a(href='/upload2') Go
table.table#stable
caption User Contact Details
|
thread
tr
th #
|
th FirstName
|
th LastName
|
th Email ID
|
each user, i in userlist2
tr(id=i)
td
input.contactID(type='checkbox')
td
| #{user.firstname}
td
| #{user.lastname}
td(id='email'+i)
| #{user.email}
button.btn.btn-danger#delete-button Delete Selected Contacts
【问题讨论】:
-
为什么不把所有的列表放在一个集合中呢? MongoDB 的设计目的是在一个集合中包含多个文档,而不是在一个文档中包含多个集合。
-
@ThomasBormans 假设有 3 个列表,如果我只有一个集合,则用户在其中一个列表中添加联系人,然后添加的联系人将显示在所有 3 个列表中,否则将显示只有一个列表?我有点困惑。
-
我所做的是我分配了一个集合用于保存数据库中的列表,另一个集合用于保存指定列表中的用户联系人。我手动完成了 3 个列表。让我感到奇怪的是,我应该如何分配一个集合以在列表中创建新列表,然后将联系人添加到指定列表。我是这个 Mongodb 和 Nodejs 的新手,发现很难得到我想要的东西。你能建议我最好的方法吗?
-
请根据您的问题编辑您的问题,并提供更多(和具体)示例来说明您存储的数据以及您想要实现的目标。这将使每个人都更容易。
-
非常抱歉,但没有......您正在创建路线、功能......但您的数据存储模式不正确。到目前为止,用户可以创建多个列表并可以链接多个联系人,以便每个列表。一个联系人可以链接到一个或多个列表。然而,这并不能解释需要多个集合,更不用说每个用户一个集合了。