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 } } }
    

    总结

  • 相关阅读:
    085 Maximal Rectangle 最大矩形
    084 Largest Rectangle in Histogram 柱状图中最大的矩形
    083 Remove Duplicates from Sorted List 有序链表中删除重复的结点
    082 Remove Duplicates from Sorted List II 有序的链表删除重复的结点 II
    081 Search in Rotated Sorted Array II 搜索旋转排序数组 ||
    080 Remove Duplicates from Sorted Array II 从排序阵列中删除重复 II
    079 Word Search 单词搜索
    078 Subsets 子集
    bzoj2326: [HNOI2011]数学作业
    bzoj2152: 聪聪可可
  • 原文地址:https://www.cnblogs.com/le0zh/p/add-update-delete-object-array-schema-mongoosemongodb.html
Copyright © 2011-2022 走看看