使用mongoose保存子文档

时间:2014-03-05 17:18:46

标签: node.js mongodb mongoose

我有这个:

exports.deleteSlide = function(data,callback){
    customers.findOne(data.query,{'files.$':1},function(err,data2){

        if(data2){
            console.log(data2.files[0]);
            data2.files[0].slides.splice((data.slide-1),1);
            data2.files[0].markModified('slides');              


            data2.save(function(err,product,numberAffected){

                if(numberAffected==1){
                    console.log("manifest saved");
                    var back={success:true};
                    console.log(product.files[0]);
                    callback(back);
                    return;
                }
            });
        }
    });
}

我收到了“已保存的消息”消息以及successtrue的回调。

当我第一次找到数据时执行console.log,并在保存数据后将其与console.log进行比较,看起来就像我期望的那样。我没有任何错误。

然而,当我在运行此代码后查看数据库时,看起来似乎没有任何改变。我应该删除的元素仍会出现?

这里有什么问题?

编辑:

对于我的查询,我执行{'name':'some string','files.name':'some string'},如果找到该对象,我会得到一个files数组,其中包含一个对象。

我猜这是一个子网。

我环顾四周,它说保存subdocs的规则与保存整个集合不同,或者更确切地说,仅在保存根对象时才应用subdoc。

我通过抓取整个根对象来解决这个问题,然后我循环找到我想要的实际子块I,在操作之后,我保存了整个对象。

我可以避免这样做吗?

1 个答案:

答案 0 :(得分:0)

我可能只是为这个查询切换到使用本机驱动程序,因为它更简单。 (就此而言,我最近在我的主要项目上放弃了猫鼬,并对速度提升感到满意。)

您可以找到有关在其他位置访问本机集合的文档。

遵循以下建议: https://stackoverflow.com/a/4588909/68567

customersNative.update(data.query, {$unset : {"slides.1" : 1 }}, function(err){
  if(err) { return callback(err); }

  customersNative.findAndModify(data.query, [],
   {$pull: {'slides' : null } }, {safe: true, 'new' : true}, function(err, updated) {
  //'updated' has new object
} );
});