我发布的json数据格式为:
{
"name": "john",
"tags": [{
"chapter": "",
"comment": ""
}]
}
有一种方法可以避免使用空字段创建一个空的嵌入式文档(带有自己的ObjectId)吗?
答案 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