注意下面的代码,它显示了一个包含2个数组的架构,其中一个被配置为from Type:
[
mongoose.Schema.Types.Mixed
]
其中一个被配置为from类型:
[
{
value: mongoose.Schema.Types.Mixed
}
]
代码如下:
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var schema = new mongoose.Schema({
withSchema: [{
value:mongoose.Schema.Types.Mixed}
],
withoutSchema: [mongoose.Schema.Types.Mixed],
} , {minimize: false});
var Tweak = mongoose.model('tweak', schema );
我使用相同的数据更新文档:
var data = {
"withSchema" : [ { "value": { a:"221", b:{} } } ],
"withoutSchema" : [ { "value": { a:"221", b:{} } } ]
}
Tweak.findByIdAndUpdate("545680170960023a185ea77e", data, function(err, doc){
console.log(doc);
//{
// "withSchema" : [ { "value": { a:"221" } } ],
// "withoutSchema" : [ { "value": { a:"221", b:{} } } ]
//}
});
如何防止此b:{}删除?
编辑
事实证明,只有当数组中有embeddedDocument时,才会发生这种情况。
发布于 2018-06-09 04:03:55
从数组中删除空对象-是由schema的minimize选项引起的-该选项缺省为'true‘。Erken在上面被否决的答案中的一条评论中回答了这个问题--把它作为一个单独的答案,这样人们就可以找到它。
在架构中可以重写为'false‘-然后它将在数组中保存空对象
var schema = new Schema({ name: String, inventory: {} }, { minimize: false });
发布于 2014-11-11 13:25:20
这种方法首先从Mongo检索文档,然后发出更新命令(由调用save触发)。看一下下面的代码。
var id = "54619b5ef610b70b14a46e79";
Tweak.findById(id, function(err, result) {
if (err) {
console.log(err);
}
console.log(result.withSchema[0].value);
result.withSchema[0].value = data.withSchema[0].value;
result.withoutSchema.value = data.withoutSchema.value;
result.save(function(err) {
if (err) {
console.log(err);
}
console.log('updated');
});
});
保存文档后,使用适当的“id”值运行代码片段。
发布于 2014-11-05 06:00:57
mongoose会跳过求值为null
的对象(就像你的b一样)。由于在所有MongoDB驱动程序甚至外壳查询中,空的或不存在的对象的计算结果都是null
,因此是否保存空的b
实际上并不重要。
例如,如果查询b是否存在,由于b
为空,因此它的计算结果为null
,因此对该文档的查询将失败,无论b
是空值还是根本不存在。
由于您已经使用了minimize
选项,因此我假定不显示空结果,因为它的计算结果为null。当用shell检查时,键应该是空值。
底线:出于所有实际目的,无论b是否包含空值,都没有区别。
https://stackoverflow.com/questions/26703742
复制相似问题