【问题标题】:how to create a new collection automatically in mongodb如何在mongodb中自动创建一个新集合
【发布时间】: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 的新手,发现很难得到我想要的东西。你能建议我最好的方法吗?
  • 请根据您的问题编辑您的问题,并提供更多(和具体)示例来说明您存储的数据以及您想要实现的目标。这将使每个人都更容易。
  • 非常抱歉,但没有......您正在创建路线、功能......但您的数据存储模式不正确。到目前为止,用户可以创建多个列表并可以链接多个联系人,以便每个列表。一个联系人可以链接到一个或多个列表。然而,这并不能解释需要多个集合,更不用说每个用户一个集合了。

标签: node.js mongodb


【解决方案1】:

首先,这听起来不是一个好主意。如果您对所有用户的所有列表都有一个集合,那会好得多。集合过多的问题在于 MongoDB 不提供任何工具来一次从多个集合中选择数据。所以当你想从多个集合中查询数据时,你将不得不执行多个查询,这是非常低效的。

但是,当您决定坚持这种架构时,MongoDB 会在您将数据插入到它不知道的集合名称中时自动创建一个集合。

【讨论】:

  • $lookup 与联接不相似吗? farenda.com/mongodb/mongodb-join-collections
  • @MrMesees 它在 2015 年没有。但即使在今天,$lookup 也只有有限的用途,因为它不适用于分片集合。
  • 我不知道。谢谢
猜你喜欢
  • 1970-01-01
  • 2014-10-13
  • 2012-10-07
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多