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

时间:2018-02-22 17:21:40

标签: node.js database mongodb nodes mongoose-populate

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

这是list.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);

task.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 个答案:

答案 0 :(得分:0)

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

您可以在taskIns回调中移动find()保存操作,或使用promises来解决问题。

例如,使用回调:

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');
        }
    });
});

答案 1 :(得分:0)

您必须使用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');
      }
    });
  });