MongooseJS使用find通过引用查找

时间:2012-09-25 16:24:45

标签: node.js mongodb express mongoose

我有这个Mongoose Schema。

var mongoose = require ('mongoose')
  , dev      = require ('../db').dev ();

var schema = new mongoose.Schema ({
  date: {
    type: Date,
    default: Date.now
  },
  company: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Company'
  },
  questionnaire: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Questionnaire'
  }
});

module.exports = dev.model ('Survey', schema);

我只想查找具有特定公司ID的调查。我怎么做?我试过(使用我的Express处理程序):

app.get ('/survey', function (req, res) {
  Survey.find ({ company: req.query.company }).populate ('questionnaire').exec (function (err, surveys) {
    return res.json (surveys);
  });
});

3 个答案:

答案 0 :(得分:7)

在您的最新评论中,您说company集合的Surveys字段实际上是字符串而不是ObjectId,这就是为什么这不起作用。由于您的架构定义将company声明为ObjectId,因此Mongoose会将您的req.query.company值转换为ObjectId,然后在Surveys中查询其company属性为ObjectId的文档。相同的价值。因此,如果company是数据库中的字符串,则它将不匹配。

如果您将company中的Surveys值更新为ObjectIds而不是字符串,那么这将有效。

答案 1 :(得分:0)

你试过'company._id

吗?
app.get ('/survey', function (req, res) {
  Survey.find ({ 'company._id': req.query.company }).populate ('questionnaire').exec (function (err, surveys) {
    return res.json (surveys);
  });
});

答案 2 :(得分:0)

对我有用的(并在已接受的答案中有所提示)是确保通过猫鼬(即通过您的快递服务器)创建文档,因为这将强制将架构加载到它们上,因此id将是存储为objectIds。

最初,我是使用objectIds作为简单字符串通过数据库手动创建文档的,这会导致查询无法正常工作,因为mongo(从您的服务器)将id转换为ObjectId。