如何将集合与用户链接?

时间:2018-02-20 03:22:35

标签: node.js angular mongodb mongoose

我正在研究MEAN应用程序(Angular2 +)。我想为每个用户维护一个单独的数据。截至目前,数据就像任何人都可以查看任何细节,但我想要,如果我登录并输入详细信息,只有我可以查看这些详细信息。基本上我想将用户集合与其他集合相关联。由于我是Mongo的新手,我对此一无所知。

user.ts

  import * as mongoose from 'mongoose'
  const userSchema = new mongoose.Schema({
  username: String,
  email: { type: String, unique: true, lowercase: true, trim: true },
  password: String,
  role: String
  });

cat.ts

import * as mongoose from 'mongoose';
const catSchema = new mongoose.Schema({
name : String,
height: String,
weight: String,
});

我不知道这是什么

base.ts

abstract class BaseCtrl {
abstract model: any;

// Get all
getAll = (req, res) => {
this.model.find({}, (err, docs) => {
  if (err) { return console.error(err); }
  res.json(docs);
});
 }

// Count all
count = (req, res) => {
this.model.count((err, count) => {
  if (err) { return console.error(err); }
  res.json(count);
});
 }

// Insert
insert = (req, res) => {
const obj = new this.model(req.body);
obj.save((err, item) => {
  // 11000 is the code for duplicate key error
  if (err && err.code === 11000) {
    res.sendStatus(400);
    }
  if (err) {
    return console.error(err);
   }
  res.status(200).json(item);
  });
  }
// Get by id
get = (req, res) => {
this.model.findOne({ _id: 'req.params.id '}, (err, obj) => {
  if (err) { return console.error(err); }
  res.json(obj);
  });
  }

// Update by id
update = (req, res) => {
this.model.findOneAndUpdate({ _id: req.params.id }, req.body, (err) => {
  if (err) { return console.error(err); }
  res.sendStatus(200);
});
}

 // Delete by id
 delete = (req, res) => {
this.model.findOneAndRemove({ _id: req.params.id }, (err) => {
  if (err) { return console.error(err); }
  res.sendStatus(200);
 });
 }
 }

export default BaseCtrl;

参考项目: https://github.com/DavideViolante/Angular-Full-Stack

1 个答案:

答案 0 :(得分:0)

您需要将user_id字段添加到catSchema。 user_id将是添加/保存该猫的用户的参考。

cat.ts

import * as mongoose from 'mongoose';
const catSchema = new mongoose.Schema({
   name : String,
   height: String,
   weight: String,
   user_id: String, // Or may be ObjectId
});

您需要从用户集合中查询用户以便每次都检索数据。

或者您可以使用mongodb的DBRef。要在mongoose中实现此功能,您可以关注this链接。

基本上你的猫模型将是

cat.ts

import * as mongoose from 'mongoose';
const catSchema = new mongoose.Schema({
   name : String,
   height: String,
   weight: String,
   user: { type: mongoose.Schema.ObjectId, ref: 'User' }
});

要插入cat,请从登录详细信息/会话中获取用户ID并添加到集合。

对于您来说,您需要将“user”字段添加到req.body,就像在您从req.body创建模型的基本控制器中一样。 如果您不想添加到req.body,则可以覆盖cat控制器的insert方法,并使用userid手动创建cat模型。

控制器/ cat.ts

import Cat from '../models/cat';
import BaseCtrl from './base';

export default class CatCtrl extends BaseCtrl {
   model = Cat;

   insert = (req, res) => {
     const data = {
        title: req.body.title,
        height: req.body.height,
        weight: req.body.weight,
        user: getUser() // Get the logged in userid
     };
     const obj = new this.model(data);

     obj.save((err, item) => {

     if (err && err.code === 11000) {
       res.sendStatus(400);
     }
     if (err) {
       return console.error(err);
     }
     res.status(200).json(item);
   })
 }
}

如上所述,您可以根据用户修改和过滤所有文档。

修改: 为简单起见,请在表单中发送当前登录的用户。 cats.component.ts

addCat() {
    this.addCatForm.value.userid = this.authService.currentUser._id; // You might need to use callback here
    ... // All other code
  }

将cat控制器恢复为原样。