Mongoose会将嵌套文档数组中的空对象删除。

10
请注意以下代码,它展示了一个包含两个数组的模式,其中一个被配置为类型:
[
  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时才会发生这种情况。

你正在使用的 Mongoose 版本是什么? - BatScream
3个回答

23

从数组中删除空对象 - 是由模式的最小化选项引起的 - 默认为“true”。Erken在上面被投票下降的答案评论中回答了这个问题 - 将其作为单独的答案发布,以便人们可以找到它。

可以在模式中覆盖为“false” - 然后将保存数组中的空对象

var schema = new Schema({ name: String, inventory: {} }, { minimize: false });

来自http://mongoosejs.com/docs/guide.html#minimize


非常好。这应该是被接受的答案。一直在寻找这个,特别是对于嵌套对象非常有用。 - Michelangelo

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

评估为null的对象(例如您的b)将被mongoose跳过。由于在所有MongoDB驱动程序和shell查询中,空或不存在的对象都评估为null,因此保存空的b或不保存实际上没有区别。

例如,如果查询b是否存在,由于b为空,它会被评估为null,因此该查询将针对该文档失败,无论b是具有空值还是不存在。

由于您已经使用了minimize选项,我假设由于其评估为null,因此不会显示空结果。当使用shell进行检查时,该键应存在且具有空值。

底线:实际上,对于所有实际目的来说,b存储空值或不存在没有区别。


他们允许 {minimize: false} 选项,因为在许多情况下它会产生影响... 在我看来,这是一个可怕的答案。 - ekeren
我无法看到在合理创建的查询中它有实际差别的用例。仅仅存在一个键不应该具有隐含意义。而且当检查a.b是否为空时,b是否为空实际上并没有区别,因为它根本不存在,因此被评估为null,或者它明确地持有一个空值。 - Markus W Mahlberg
假设您将一个字典序列化为JSON格式,其中键A包含另一个空字典而不是null。这是数据,而不是查询。 - ekeren
1
在底线上,您没有回答我的问题。 - ekeren
@ekeren 他在第一句话中回答了你的问题。+1 - Luca Fagioli
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接