【问题标题】:Duplicated Mongo Document Has No _id in Save Callback Function重复的 Mongo 文档在保存回调函数中没有 _id
【发布时间】:2014-08-17 17:56:34
【问题描述】:

我是 mongoose 和 mongo 的新手,我需要一些帮助。我正在尝试使用 node.js 和 mongoose 在 Mongo 中复制现有文档。

我的过程是:

  1. 找到要复制的文档。
  2. 创建一个新的架构对象,传入第一个文档的架构对象,该对象是在第一步中检索到的。
  3. 删除在第二步中创建的对象的“_id”属性。
  4. 保存新对象。

这很好用。问题是我需要另一种文档类型,它包含一个 id 作为对此类文档的引用。在成功回调中,传入的对象没有“_id”字段的值。这是我试图抓住它以保存在另一个文档中的地方。但是,当我检查数据库时,文档已成功保存并且实际上确实有一个“_id”。

有人可以解释一下这里发生了什么,或者我可能在哪里误解了这个过程。

这是我的代码: 在控制器中:

          async.each(cards, function(card, nextCard) {¬
¬
            var newCard = new Card(card);¬
            newCard.story_id = story._id;¬
            newCard.linkedElements = [];¬
¬
            newCard._id = null;¬
            delete newCard._id;¬
            // The id has been removed to avoid¬
            // duplicates in mongo.¬
¬
            newCard.save(function(err, savedCard) {¬
¬
              if (err) {¬
                console.log('err', err);¬
                process.exit();¬
              }¬
              // There were no errors.¬
¬
              // The current card was duplicated.¬
¬
              Element¬
                .find({'card_id': card._id}, function(err, elements) {¬
¬
                if (err) {¬
                  console.log('err', err);¬
                  process.exit();¬
                }¬
                // There were no errors.¬
¬
                async.each(elements, function(element, nextElement) {¬
¬
                  var newElement = new Element();¬
¬
                  console.log('New card : ', newCard);¬
                  console.log('Saved card : ', savedCard);¬
¬
                  newElement.card_id = savedCard._id;¬
                  ** I BELIEVE THIS IS THE PROBLEM! **
¬
                  newElement._id = null;¬
                  delete newElement._id;¬
                  // The id has been removed to avoid¬
                  // duplicates in mongo.

控制台日志和节点的输出:

New card :  { story_id: 53f0e8f3c45582e00927a501,
  rank: 1,
  published: 'true',
  __v: 0,
  _id: null,
  linkedElements: [] }
Saved card :  { story_id: 53f0e8f3c45582e00927a501,
  rank: 1,
  published: 'true',
  __v: 0,
  _id: null,
  linkedElements: [] }
POST /admin/stories/duplicate/53f0e4c1c973f73b08942591 200 18ms - 277b
err { [VersionError: No matching document found.] message: 'No matching document found.', name: 'VersionError' }

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    我想知道为什么它会起作用。当您在 mongoose 文档上调用 .save() 时,它会发出 update 操作,仅将更新的字段发送到 MongoDB。较新的使用 MongoDB save 命令,仅使用 insertupdate

    可能猫鼬只检查insert/update操作的状态。

    我可以看到两个选项。

    1.在调用new Card构造函数之前删除_id

    delete card._id;
    var newCard = new Card(card);
    

    或者,如果cardmongoose 文档:

    card_data = card.toObject();
    delete card_data._id;
    var newCard = new Card(card_data);
    

    2. 设置新的_id 字段而不是删除它:

    newCard._id = new mongoose.Types.ObjectId();
    

    【讨论】:

    • 第一种方法对我不起作用,但第二种方法对我有用。谢谢!
    猜你喜欢
    • 2017-12-04
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    相关资源
    最近更新 更多