代码之家  ›  专栏  ›  技术社区  ›  Sahil Vasava

Mongoose:将另一个文档的ref保存到对象数组中文档返回空数组

  •  1
  • Sahil Vasava  · 技术社区  · 7 年前

    我正在尝试将特定文档的引用id添加到另一个文档的对象数组中。这样我就可以使用populate方法了。但不知何故,即使在按下ref之后,数组仍然是空的。 请帮帮我。提前谢谢你。

    以下是列表。js公司:

      const mongoose = require('mongoose');
    
      const User = require('./user');
      const Task = require('./task');
      const Schema = mongoose.Schema;
      // User Schema
      const ListSchema = mongoose.Schema({
        item:{
          type: String,
          required: true
        },
        purpose:{
          type: String,
          required: true
        },
        user: {
          type: Schema.ObjectId,
          ref:"User"
        },
        deadline:{
          type: Date,
          default: null
        }
      });
    
      const List = module.exports = mongoose.model('List', ListSchema);
    

    任务js公司:

      const mongoose = require('mongoose');
      const Schema = mongoose.Schema;
      const List = require('./list');
      // User Schema
      const TaskSchema = mongoose.Schema({
        task:{
          type: String,
          required: true
        },
        list: [{
          type: Schema.Types.ObjectId,
          ref:'List'
        }]
    
      });
    
      const Task = module.exports = mongoose.model('Task', TaskSchema);
    

    以下是我如何创建和保存新任务实例:

      const express = require('express');
      const mongoose = require('mongoose');
      const router = express.Router();
    
      let List = require('../models/list');
      let User = require('../models/user');
      let Task = require('../models/task');
    
      router.post('/add', isAuthenticated, function(req,res){
        var tasker = req.body.task, listshash= [];
        var startIndex = 0, index;
          var x,y,listid= [];
          while ((index = tasker.indexOf("#", startIndex)) > -1) {
            var ind = tasker.indexOf(" ", index);
            if(ind == -1)
                listshash.push(tasker.substring(index+1));
          else  
              listshash.push(tasker.substring(index+1,ind));
              startIndex = index + 1;
          }
    
          //Instance of task
          var taskIns = new Task({task: req.body.task});
    
          List.find({user: req.session.passport.user}, function(err, lists){
          for(x in lists){
            for(y in listshash){
              if(lists[x].item.toLowerCase().replace(/\s/g,'') == listshash[y]){
                //lists[x] contains the document "list" that I want to store as 
                //ref in list property array of task
                taskIns.list.push(lists[x]);
                //console.log(taskIns.list.push(lists[x]));
    
              }
            }
          }
        });
        taskIns.save(function(err, doc){
            if(err) res.json(err);
            else    {
              console.log("Saved");
              res.redirect('/lists');
          }
        });
      });
      module.exports = router;
    

    这是插入数据后任务的数据库集合的外观: See the data

    2 回复  |  直到 7 年前
        1
  •  0
  •   Rupesh    7 年前

    你应该使用 async npm公司

    List.find({user: req.session.passport.user}, function(err, lists){
         async.each(lists ,function(x,callback){
              async.each(listhash, function(y,callback){
                   if(x.item.toLowerCase().replace(/\s/g,'') == y){
                       taskIns.list.push(x);
                   }
              });
         });
    
    
    //After that you can do save the data
      taskIns.save(function(err, doc){
            if(err) res.json(err);
            else    {
              console.log("Saved");
              res.redirect('/lists');
          }
        });
      });
    
        2
  •  0
  •   chridam Gino Claudi    7 年前

    它没有保存引用,因为您正在处理异步函数;您正在将列表推到 find() 回调和 taskIns 模型保存事件发生在推送之前。

    您可以移动 taskIns公司 在中保存操作 查找() 回调或使用承诺来解决问题。

    例如,使用回调:

    List.find({ user: req.session.passport.user}, (err, lists) => {
    
        const taskIns = new Task({task: req.body.task});
    
        for(x in lists) {
            for(y in listshash) {
                if(lists[x].item.toLowerCase().replace(/\s/g,'') == listshash[y]) {
                    taskIns.list.push(lists[x]);
                }
            }
        }
    
        taskIns.save((err, doc) => {
            if(err) res.json(err);
            else {
              console.log("Saved");
              res.redirect('/lists');
            }
        });
    });