zoukankan      html  css  js  c++  java
  • [原译]在mongoose中对Array Schema进行增删改

    原文地址: http://tech-blog.maddyzone.com/node/add-update-delete-object-array-schema-mongoosemongodb

    本文为上面文章的翻译版本,以学习和锻炼为宗旨,文中一些术语为了避免歧义保留英文名称

    大多数情况下,我们使用node.js的时候会使用MongoDB, 然后在写MongoDB相关的验证、转换和业务逻辑时我们会经常使用Mongoose。 这里我分享一些关于Array Schema的使用技巧。 当你读完这篇文章的时候,你将了解如何在Mongoose中增加、更新和删除一个Array Schema中的对象。

    本文将涵盖:

    1. 如何在Mongoose中定义Array Schema
    2. 如何在Mongoose中向Array Schema增加一个值或者对象
    3. 如何在Mongoose中更新Array Schema中的一个值或者对象
    4. 如何在Mongoose中删除Array Schema中的一个值或者对象

    Ok, Lest' Start.

    1. 如何在Mongoose中定义Array Schema

    首先,我们要定义一个基本的名为Article的Mongoose Schema。 这里我们将Comments定义为一个Array Schema类型。 不必要关注于所有的代码,只需要关注在Comments,这是本文讨论的重点。

    var mongoose = require('mongoose'),
        Schema = mongoose.Schema,
     
    /**
     * Article Schema
     */
    var ArticleSchema = new Schema({
      title: {type:String, required:true},
      createdAt: { type: Date, default: Date.now },
      description:{type:String, required:true},
      tags: [String],
      comments: [{ post: String,
                   posted: {type: Date, default: Date.now}
                 }]
    });
     
    mongoose.model('Article', ArticleSchema);
    

    这里我们假设我们已经在article集合中创建了一些向下面这样的数据,现在还没有任何comments:

    { 
     "_id" : ObjectId("54fcb3890cba9c4234f5c925"),
     "title" : "A test Article",
     "description" : "test article description",
     "tags" : [
     "test tag"
     ],
     "createdAt" : ISODate("2015-03-08T20:39:37.980Z")
     }
    

    2.如何在Mongoose中向Array Schema增加一个值或者对象

    当我们添加了一个article后,我们应该可以向comments中添加任意数量的数据。比如当有新的评论时,我们要将该条评论添加到comments属性中,我们看如何做。

    假设请求中我们可以拿到articleid用来指定需要向哪个article中添加评论,POST的地址像下面这样:

    /api/comments/:articleid
    

    接下来按下面的方式来操作,我们使用了findByIdAndUpdate
    假设请求的参数中articleid54fcb3890cba9c4234f5c925

    var article_id = req.params.articleid;/** assume here we get 54fcb3890cba9c4234f5c925 id 
        of article as shown in our demo json bve
         "_id" : ObjectId("54fcb3890cba9c4234f5c925"),
         **/ 
        /** assume your req.body like is below
            you can set your logic your own ways
            for this article i am assuming that data
            would come like below
        **/
        //req.body={post: "this is the test comments"};
         
         Article.findByIdAndUpdate(
         article_id,
         { $push: {"comments": req.body}},
         {  safe: true, upsert: true},
           function(err, model) {
             if(err){
            	console.log(err);
            	return res.send(err);
             }
              return res.json(model);
          });
    

    主要是使用下面这行代码我们就可以将数据插入到Array Schema:

    { $push: {"comments": req.body}}
    

    上面的操作执行之后,在MongoDB中的数据如下:

    {
     "_id" : ObjectId("54fcb3890cba9c4234f5c925"),
     "title" : "A test Article",
     "description" : "test article description",
     "tags" : [
     "test tag"
    ],
     "createdAt" : ISODate("2015-03-08T20:39:37.980Z"),
     "comments" : [
     {
     "post" : "this is the test comments",
     "_id" : ObjectId("54fe0976250888001d5e6bc4"),
     "posted" : ISODate("2015-03-09T20:58:30.302Z")
     }
     ]
    }
    

    3.如何在Mongoose中更新Array Schema中的一个值或者对象

    对于更新操作,我们假设请求中带有articleidcommentid,来定位我们想更新哪个article中的哪个comment.
    PUT地址像下面这样:

    /api/comments/:articleid/:commentid
    

    更新代码:

     Article.update({'comments._id': comment_id},
          {'$set': {
                 'comments.$.post': "this is Update comment",
    	   }},
              function(err,model) {
    	   	if(err){
            	console.log(err);
            	return res.send(err);
            }
            return res.json(model);
     });
    

    现在再看下MongoDB中的数据:

    {
     "_id" : ObjectId("54fcb3890cba9c4234f5c925"),
     "title" : "A test Article",
     "description" : "test article description",
     "tags" : [
     "test tag"
     ],
     "createdAt" : ISODate("2015-03-08T20:39:37.980Z"),
     "comments" : [
     {
     "post" : "this is Update comment",
     "_id" : ObjectId("54fe0976250888001d5e6bc4"),
     "posted" : ISODate("2015-03-09T20:58:30.302Z")
     }
     ]
    }
    

    所以使用下面这样的代码可以更新Array Schema的数据:

    {'$set': {
     'comments.$.post': "this is Update comment",
     }},
    

    4.如何在Mongoose中删除Array Schema中的一个值或者对象

    和更新一样,假设请求中有articleidcommentid,来定位我们想删除哪个article中的哪个comment.

    DELETE地址如下:

    /api/comments/:articleid/:commentid
    

    跟上面的操作一样,我们使用findByIdAndUpate方法:

    var article_id = req.params.articleid,//assume get 54fcb3890cba9c4234f5c925
        comment_id = req.params.commentid;// assume get 54fcb3890cba9c4234f5c925
      
      Article.findByIdAndUpdate(
        article_id,
       { $pull: { 'comments': {  _id: comment_id } } },function(err,model){
          if(err){
           	console.log(err);
           	return res.send(err);
            }
            return res.json(model);
        });
    

    执行之后,查看数据库中的数据:

    {
     "_id" : ObjectId("54fcb3890cba9c4234f5c925"),
     "title" : "A test Article",
     "description" : "test article description",
     "tags" : [
     "test tag"
     ],
     "createdAt" : ISODate("2015-03-08T20:39:37.980Z"),
     "comments" : []//remove comments
    }
    

    使用下面的代码可以删除Array Schema中的数据:

    { $pull: { 'comments': { _id: comment_id } } }
    

    总结

  • 相关阅读:
    python实现斐波那契数列
    Python全栈开发【课程目录】
    windows 下部署Docker
    Restful API设计
    linux下部署radis
    linux下部署rabbitmq
    Django 发送邮件
    django模板之forloop
    Django自定制插件之【随机验证码】
    Django的MultipleChoiceField处理小技巧
  • 原文地址:https://www.cnblogs.com/le0zh/p/add-update-delete-object-array-schema-mongoosemongodb.html
Copyright © 2011-2022 走看看