原文地址: 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 } } }

总结

[原译]在mongoose中对Array Schema进行增删改的更多相关文章

  1. JS中对数组元素进行增删改移

    在js中对数组元素进行增删改移,简单总结了一下方法: 方法 说明 实例 push( ); 在原来数组中的元素最后面添加元素 arr.push("再见58"); unshift( ) ...

  2. kibana的Dev Tool中如何对es进行增删改查

    kinaba Dev Tool中对es(elasticSearch)进行增删改查 一.查询操作 查询语句基本语法 以下语句类似于mysql的: select * from  xxx.yyy.topic ...

  3. 在ASP.NET MVC中对表进行通用的增删改

    http://www.cnblogs.com/nuaalfm/archive/2009/11/11/1600811.html 预备知识: 1.了解反射技术 2.了解C#3.0中扩展方法,分布类,Lin ...

  4. Django中对单表的增删改查

    之前的简单预习,重点在后面 方式一: # create方法的返回值book_obj就是插入book表中的python葵花宝典这本书籍纪录对象   book_obj=Book.objects.creat ...

  5. Django学习笔记--数据库中的单表操作----增删改查

    1.Django数据库中的增删改查 1.添加表和字段 # 创建的表的名字为app的名称拼接类名 class User(models.Model): # id字段 自增 是主键 id = models. ...

  6. Django中ORM对数据库的增删改查操作

         前言 什么是ORM?  ORM(对象关系映射)指用面向对象的方法处理数据库中的创建表以及数据的增删改查等操作. 简而言之,就是将数据库的一张表当作一个类,数据库中的每一条记录当作一个对象.在 ...

  7. (数据科学学习手札126)Python中JSON结构数据的高效增删改操作

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一期文章中我们一起学习了在Python ...

  8. Django中ORM对数据库的增删改查

    Django中ORM对数据库数据的增删改查 模板语言 {% for line in press %} {% line.name %} {% endfor %} {% if 条件 %}{% else % ...

  9. mongoose 的 model,query:增删改查

    简介 mongoose是node.js的一个操作mongodb的模块,比起之前mongodb模块,只需要在开始时连接,不需要手动关闭,十分方便. 连接mongodb 首先你需要安装mongodb.有了 ...

随机推荐

  1. ckplayer

    ckplayer 的使用基本功能实现(一) 有个项目里用到视频播放功能,虽然是国产的插件,但我觉得做的还是不错,而且是免费使用,顺便支持下国内的一些项目(O(∩_∩)O~). 一.首先去官网下载 插件 ...

  2. vs2010下载链接中国简体(中国含msdn)

    昨天一个朋友说vs2010中国版可下载,我开始不相信.只是周末.所以,我下载一试 果然,安装了中国版,原本msdn订户才能够下载,感谢朋友们上传. 文件名 cn_visual_studio_2010_ ...

  3. beanutils设置参数和获取参数

    public class Employee implements DynaBean  { private String  firstName="李";    private Str ...

  4. AngularJS 3

    AngularJS 源码分析3 本文接着上一篇讲 上一篇地址 回顾 上次说到了rootScope里的$watch方法中的解析监控表达式,即而引出了对parse的分析,今天我们接着这里继续挖代码. $w ...

  5. ASP.NET WebApi 开放数据

    概述 开放式数据协议(OData) 是用于在 web 数据访问协议.它提供统一的方式来构造数据. 查询的数据和操纵数据集通过 CRUD 操作.它支持 AtomPub (XML) 和 JSON 格式.它 ...

  6. Ecological Premium - UVa10300

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/uva10300.html 题目描述 Pr ...

  7. 在Linux使用GCC编译C语言共享库

    在Linux使用GCC编译C语言共享库 对任何程序员来说库都是必不可少的.所谓的库是指已经编译好的供你使用的代码.它们常常提供一些通用功能,例如链表和二叉树可以用来保存任何数据,或者是一个特定的功能例 ...

  8. c# 发送Email的2中方式

    先来第一种 // 版权所有 ZhuoYue Co.,Ltd 卓越一通秘密信息 // 文件名称:MyEmailByCDO.cs // 作 者:huangzh // 创建日期:2015-08-20 16: ...

  9. Bug Tracker

    Bug Tracker 使用笔记(有图有真相)   目的:管理Bug,完善业务流程. 前提条件:BugTracker是基于IIS和SQL Server和Asp.Net的.相当于一个Web端的管理系统. ...

  10. Oracle 高级查询、事物、过程及函数

    一.Sql函数 1.数值函数(输入参数和返回值都是数值型,多数函数精确到38位) --多少次方 ,) from dual; --开方 ) from dual; --绝对值 ) from dual; - ...