Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 重复的Mongo文档在保存回调函数中没有_id_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

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

Javascript 重复的Mongo文档在保存回调函数中没有_id,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我刚接触猫鼬和猫鼬,我需要一些帮助。我正在尝试使用node.js和mongoose复制Mongo中的现有文档 我的过程是: 查找要复制的文档 创建一个新的Schema对象,传入第一个文档的Schema对象,该对象是在第一步中检索到的 删除在步骤2中创建的对象的“\u id”属性 保存新对象 这个很好用。问题是我需要另一种文档类型,它保存一个id作为对这种文档类型的引用。在成功回调中,传入的对象没有“\u id”字段的值。这就是我试图抓取它保存在另一个文档中的地方。但是,当我检查数据库时,文档已成

我刚接触猫鼬和猫鼬,我需要一些帮助。我正在尝试使用node.js和mongoose复制Mongo中的现有文档

我的过程是:

  • 查找要复制的文档
  • 创建一个新的Schema对象,传入第一个文档的Schema对象,该对象是在第一步中检索到的
  • 删除在步骤2中创建的对象的“\u id”属性
  • 保存新对象
  • 这个很好用。问题是我需要另一种文档类型,它保存一个id作为对这种文档类型的引用。在成功回调中,传入的对象没有“\u id”字段的值。这就是我试图抓取它保存在另一个文档中的地方。但是,当我检查数据库时,文档已成功保存,并且实际上有一个“\u 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' }
    

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

    mongoose可能只检查
    insert
    /
    update
    操作的状态

    我可以给你两个选择

    1.在调用
    新卡之前删除
    \u id

    delete card._id;
    var newCard = new Card(card);
    
    或者,如果
    猫鼬
    文档:

    card_data = card.toObject();
    delete card_data._id;
    var newCard = new Card(card_data);
    
    2.设置新的
    \u id
    字段,而不是将其删除:

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

    第一种方法对我不管用,但第二种方法管用。谢谢