防止创建空的嵌入式文档

时间:2016-03-13 02:41:12

标签: mongoose

我发布的json数据格式为:

{
"name": "john",
"tags": [{
    "chapter": "",
    "comment": ""
}]
}

有一种方法可以避免使用空字段创建一个空的嵌入式文档(带有自己的ObjectId)吗?

1 个答案:

答案 0 :(得分:1)

另一种简单方法可以通过数据模式中的自定义set方法完成

function removeEmpty(v) {
    if (!v || 0 === v.length)
    {
        return undefined;  // remove this field if its value is empty string
    }
    return v;
}

var DataSchema = new mongoose.Schema({
    name: String,
    tags: [{
        _id: false,    // remove `_id` for subdocument.
        chapter: {type: String, set: removeEmpty},
        comment: {type: String, set: removeEmpty}
    }]
});

使用以下保存数据代码

var d = new Data({
    "name": "john"
});
d.tags.push({"chapter": "", "comment": ""})

d.save(function(err) {

结果:

{ "_id" : ObjectId("56e676b9fd12dad01cd5ed7f"), "name" : "john", "tags" : [ {  }
 ], "__v" : 0 }

如果我们要完全删除这个空的tags数组,请.pre('save' function isEmptyObject(obj) { return JSON.stringify(obj) === JSON.stringify({}); } DataSchema.pre('save', function (next) { var isEmpty = true; if (this.tags) { this.tags.forEach(function(obj) { if (!isEmptyObject(obj)) isEmpty = false; }) if (isEmpty) { this.tags = undefined; } } next(); })

function isEmpty(str) {
    return (!str || 0 === str.length);
}

YourSchmea.pre('save', function(next){
    this.tags.forEach(function(tag) {
        if (isEmpty(tag.chapter) && isEmpty(tag.comment)) {
            delete tag.chapter;
            delete tag.comment;
        }
    });
    next();
});

请尝试通过this question中间件删除空的嵌入式文档。如果字段为空字符串,请删除子文档。

ExitCmd