在Mean.js中更新mongodb文档中的数组

时间:2014-11-10 21:35:03

标签: javascript arrays angularjs mongodb mean

我刚刚开始使用mean.js并开始构建一个带有一些基本额外属性的自定义文章模块。我正在尝试通过文本输入字段添加在创建表单上添加的标记列表。正如您在下面看到的,当它们刚刚创建时,它可以正常工作。我可以在终端中新创建的文档中看到tags数组。当我加载编辑视图时,tags字段填充了逗号分隔的tags数组元素。这似乎没问题。现在我想简单地在当前的标签之后添加新标签,用逗号分隔每个新标签,并使用新列表更新数组。但是,执行更新后,tags数组元素将更改为包含所有标记的一个长字符串。 我看了一下服务器端的更新功能,但我不太清楚该怎么做才能使它工作。看来这篇文章正在作为一个完整的对象进行更新,所以也许我需要提取标签数组并分别执行推送新标签?任何人都知道我做错了什么?我已经对它进行了一天左右的故障排除了我没有想法。提前谢谢!

新文章的JSON打印:

{
"user" : ObjectId("545db575197ad8a949894a18"),
"desc" : “some description”,
"_id" : ObjectId("546115f20a3048862033d393"),
"created" : ISODate("2014-11-10T19:45:54.079Z"),
"tags" : [
    "here”,
    "be",
    "tags"
],
"name" : "Test”,
"__v" : 0
}

更新后的JSON打印 - 注意:标签现在是一个字符串

{
"__v" : 1,
"_id" : ObjectId("546115f20a3048862033d393"),
"created" : ISODate("2014-11-10T19:45:54.079Z"),
"desc" : "some description",
"name" : "Test",
"tags" : [
    "here,be,tags,more"
],
"user" : ObjectId("545db575197ad8a949894a18")
}

//创建新文章

    $scope.create = function() {
        console.log('Tags before split: ' + this.tags);
        var tags = this.tags;
        var tags = tags.split(" ");
        console.log(“Tags array “ + tags);

        // Create new article object
        var article = new Article ({
            name: this.name,
            desc: this.desc,
            tags: tags

        });

//更新现有文章

        $scope.update = function() {

        var article = $scope.article;
        console.log(“This " 
            + article);

        article.$update(function() {
            $location.path('articles/' + article._id);
        }, function(errorResponse) {
            $scope.error = errorResponse.data.message;
        });
    };

在create-article视图中标记输入字段

        <div class="form-group">
                <label class="control-label" for="tags">Tags</label>
                <div class="controls">
                    <input type="text" data-ng-model="tags" id="tags" class="form-control" placeholder="Tags" required>
                </div>
        </div>

在更新文章视图中标记输入字段

           <div class="form-group">
                <label class="control-label" for="tags">Tags</label>
                <div class="controls">
                    <input type="text" data-ng-model="article.tags" id="tags" class="form-control" placeholder="Tags" required>
                </div>
            </div>

更新文章服务器端控制器

 /**
 * Module dependencies.
 */
 var mongoose = require('mongoose'),
 errorHandler = require('./errors.server.controller'),
 Article = mongoose.model('Article'),
 _ = require('lodash');

exports.update = function(req, res) {   

var article = req.article;

article = _.extend(article , req.body);

article.save(function(err) {
    if (err) {
        return res.status(400).send({
            message: errorHandler.getErrorMessage(err)
        });
    } else {
        res.jsonp(article);
    }
});
};

文章模型

var ArticleSchema = new Schema({
name: {
    type: String,
    default: '',
    required: 'Please fill Article name',
    trim: true
},
desc: String,
tags: [String],
created: {
    type: Date,
    default: Date.now
},
user: {
    type: Schema.ObjectId,
    ref: 'User'
}
});

mongoose.model('Article', ArticleSchema);

1 个答案:

答案 0 :(得分:0)

您需要在更新之前拆分标记,就像在create函数中一样。