复制的Mongo文档在保存回调函数中没有_id

时间:2014-08-17 17:56:34

标签: javascript node.js mongodb mongoose

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

我的流程是:

  1. 找到要复制的文档。
  2. 创建一个新的Schema对象,传入第一个文档的架构对象,该对象在第一步中检索。
  3. 删除在第二步中创建的对象的“_id”属性。
  4. 保存新对象。
  5. 这很好用。问题是我需要另一种文档类型,它包含一个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' }
    

1 个答案:

答案 0 :(得分:1)

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

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

我可以看到两个选项。

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

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();