请注意以下代码,该代码显示具有2个数组的模式,其中一个数组配置为来自Type:
[
mongoose.Schema.Types.Mixed
]
,其中一个配置为类型:
[
{
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:{}删除?
修改:
事实证明只有在Array中有embeddedDocument时才会发生这种情况。
答案 0 :(得分:1)
从数组中删除空对象 - 是由schema的最小化选项引起的 - 默认为'true'。 Erken在上面的评论中给出了一个评论中的回答 - 将其作为一个单独的答案,以便人们可以找到它。
可以在模式中重写为“false” - 然后它将在数组中保存空对象
var schema = new Schema({ name: String, inventory: {} }, { minimize: false });
答案 1 :(得分:0)
这种方法包括首先从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”值的代码段。
答案 2 :(得分:-3)
mongoose会跳过评估为null
(与你的b一样)的对象。由于空的或不存在的对象在所有MongoDB驱动程序中进行评估null
,甚至是shell查询,它实际上也没有区别于是否保存了空b
。
例如,如果您查询b是否存在,由于b
为空,它的计算结果为null
,因此该文档的查询将失败,无论b
是否为空价值或根本不存在。
由于您已经使用了minimize
选项,因此我假设不会显示空结果,因为它的计算结果为null。使用shell进行检查时,密钥应该为空值。
底线:出于所有实际目的,它没有区别,因为b保持空值或者根本不存在。