【问题标题】:Saving subdocuments with mongoose使用 mongoose 保存子文档
【发布时间】:2014-04-07 22:02:39
【问题描述】:

我有这个:

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 数组。

我猜这是一个子文档。

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

我一直在通过抓取整个根对象来解决这个问题,然后我执行循环以找到我想要的实际子文档,并且在我操作它之后,我保存整个对象。

我可以避免这样做吗?

【问题讨论】:

标签: node.js mongodb mongoose


【解决方案1】:

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

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

以下建议: 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
} );
});

【讨论】:

  • 我将在这段代码中的什么位置修改对象?在update 电话之后还是findAndModify 电话之后?我将如何保存它?另外,“本机驱动程序”是指股票 mongodb 功能还是其他?
  • 您的目标是从幻灯片数组中删除一个项目,对吧?此代码删除“1”位置的项目。
  • 哦,好的。我认为该位可能意味着“返回slides 的一个元素”之类的。但是为什么需要findAndModify 调用呢? update 是否保存在数据库中?我应该在updated 对象上调用save 吗?最后,“本地驱动程序”是什么意思?
猜你喜欢
  • 1970-01-01
  • 2020-05-15
  • 2016-08-10
  • 2015-07-03
  • 2017-10-06
  • 2014-11-08
  • 1970-01-01
  • 2014-08-22
  • 2013-09-20
相关资源
最近更新 更多