mongoose正在从数组中的嵌入文档中删除空对象

时间:2014-11-02 20:02:42

标签: node.js mongodb mongoose

请注意以下代码,该代码显示具有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时才会发生这种情况。

3 个答案:

答案 0 :(得分:1)

从数组中删除空对象 - 是由schema的最小化选项引起的 - 默认为'true'。 Erken在上面的评论中给出了一个评论中的回答 - 将其作为一个单独的答案,以便人们可以找到它。

可以在模式中重写为“false” - 然后它将在数组中保存空对象

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

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

答案 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保持空值或者根本不存在。