[原译]在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中的对象。
本文将涵盖:
- 如何在Mongoose中定义Array Schema
- 如何在Mongoose中向Array Schema增加一个值或者对象
- 如何在Mongoose中更新Array Schema中的一个值或者对象
- 如何在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
假设请求的参数中articleid
是54fcb3890cba9c4234f5c925
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中的一个值或者对象
对于更新操作,我们假设请求中带有articleid
和commentid
,来定位我们想更新哪个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中的一个值或者对象
和更新一样,假设请求中有articleid
和commentid
,来定位我们想删除哪个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 } } }