【问题标题】:mongoose findall return data from a different modelmongoose findall 从不同的模型返回数据
【发布时间】:2016-06-02 17:45:18
【问题描述】:

users.js 中:

var mongoose = require('mongoose');

var User = mongoose.model('user', {
  username: {
    type: String,
    required: true,
    unique: true,
    lowercase: true,
  },  
  tasks: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Tasks',
  }],
});
module.exports = User;

然后我添加一个名为 user1 的新用户并保存到 mongo。

mongo 文档看起来像:

{ 
    "_id" : ObjectId("574fb94f6a1e7d1826c16058"),
    "username" :  "user1",
    "tasks" : [ ],
    "__v" :  0
}

然后尝试获取文档,它在这个处理程序中工作正常:

handlerA.js 中:

var User = require('../models/users.js');

module.exports.getUser = function(req, res){
  User.findOne({username: "user1"}, function(err, data){
    if(err){
      console.log('getUser err', err);
      res.send('ERROR')
    } else {
      console.log('getUser fx success = ', err, data);
      res.send(data)
    }
  });
};

console.log的结果:

getUser fx success = null { tasks: [], __v: 0, username: 'user1', _id: 574fb94f6a1e7d1826c16058 }


但相同的代码在单独文件中的其他处理程序中失败。

handlerB.js 中:

var User = require('../models/users.js');

module.exports.addStuff = function(req, res){
   User.findOne({username: "user1"}, function(err, data){
    if(err){
      console.log('addStuff err', err);
      res.send('ERROR')
    } else {
      console.log('addStuff fx success =', err, data);
      res.send(data)
    }
  });
};

console.log 的结果:

addStuff fx 成功 null null

尝试过....失败了....

我还尝试了这个问题的其他解决方案:Mongoose query return null

Mongoose 将模型名称复数化,因此它在“blogposts”集合而不是“blogpost”上运行 find。也就是说,您在 mongo shell 中的查询位于“blogmodel”集合中。在这种情况下:

var BlogModel = mongoose.Model("BlogModel", ..)

或将集合名称作为第三个参数传递:

var BlogModel = mongoose.model("BlogPost", schema, "blogmodel")

此解决方案导致 handlerA.js 以及 handlerB.js 返回一个空文档。

感谢您的宝贵时间。非常感谢。


附录。 我在 handlerB.js 的 User 和 Tasks 模型下运行了 find({}) 在两种情况下返回的文档都是基于 Tasks 模型的。 有关 User.find({}) 和 Tasks.find({}),请参阅下面的 console.logs 错误是空值,然后是数据。

我把东西弄坏到什么程度? Model.find 如何返回甚至不在模型中的数据?

User.find({},funtion(err, data) ____________________
console.log of err  then data
null 
[ { subtasks: [],
    team: [ [Object] ],
    __v: 0,
    maintask: '1',
    _id: 574fce63d744cba421f750c1 
  },
  { subtasks: [],
    team: [ [Object] ],
    __v: 0,
    maintask: '2',
    _id: 574fce65d744cba421f750c2 
  }
]

Tasks.find({},function(err, data) ___________________ 
console.log of err then data
null 
[ { subtasks: [],
    team: [ [Object] ],
    __v: 0,
    maintask: '1',
    _id: 574fce63d744cba421f750c1 },
  { subtasks: [],
    team: [ [Object] ],
    __v: 0,
    maintask: '2',
    _id: 574fce65d744cba421f750c2 
  },
]

这是任务模型... tasks.js

var mongoose = require('mongoose');

var subtaskSchema = new mongoose.Schema({
   subtask: {
   type: String,
  },
  team: {
    type: Array,
    'defualt': [],
  },
  done: {
    type: Boolean,
    'defualt': false,
  },
});

var Tasks = mongoose.model('tasks', {
  maintask: {
    type: String,
  },
  subtasks: {
    type: [subtaskSchema],
  },
  team: {
    type: Array,
    'defualt': [],
  },
  done: {
    type: Boolean,
    'defualt': false,
  },
});

module.exports = Tasks;

【问题讨论】:

  • 如何调用 addStuff 和 getUser?
  • var express = require('express'); var app = express(); var bodyParser = require('body-parser'); // 数据库 var mongoose = require('mongoose'); mongoose.connect(process.env.MONGOLAB_URI || 'mongodb://localhost/taskmaster');
  • // 处理请求 var handleUsers = require('./server/services/handleUsers.js') app.post('/addUser', handleUsers.addUser); app.get('/getUser/:username', handleUsers.getUser); app.get('/getAllUsers', handleUsers.getAllUsers);
  • var handleTasks = require('./server/services/handleTasks.js') app.post('/addTaskOwner', handleTasks.addTaskOwner); app.put('/addStuff', handleTasks.addStuff);
  • 我在 handlerB (有问题的那个)中尝试了 User.find({}, funtion(err, data){......} 并且返回的文档是任务集合!因此 mongo shell 命令 db.tasks.find() 返回与 User.find({}...... 相同的内容

标签: javascript node.js mongodb


【解决方案1】:

mongoose docs 建议这样定义模型,你试过吗?

var schema = new mongoose.Schema({ name: 'string', size: 'string' });
var Tank = mongoose.model('Tank', schema);

【讨论】:

  • 你好鲁迪。泰寻求帮助。不幸的是,我认为它没有解决我的问题。当 handlerB.js 中的 User.find({}) 时,我仍然返回 Tasks 模型。
  • var userSchema = new mongoose.Schema({ username: { type: String, required: true, unique: true, lowercase: true, }, }); module.exports = mongoose.model('User', userSchema);
  • 也许这是朝着正确方向迈出的一步。我找不到有关您创建模型/模式的方式的任何信息。与Tasks 相同,模式定义应该是mongoose.Schema 的实例
  • 我已经尝试根据文档示例为两个模型创建模型。仍然返回 User.find({}) 而不是用户的任务。关于我编写模型的方式。我基本上是在“在线”编写模式,我认为(hmmmm)它只是语义 - 与文档示例没有真正的区别。我在其他地方看到过这种技术。
  • 如果你知道你在做什么好,否则最好坚持文档:) 这个问题听起来很奇怪。您是否仔细检查了您require 的模型文件是否正确,并且没有意外要求任务模型两次?
猜你喜欢
  • 1970-01-01
  • 2020-05-14
  • 2019-02-10
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 2019-02-11
  • 2019-08-16
  • 2019-02-11
相关资源
最近更新 更多