如何返回在数组中找到值的文档? Mongoose.js

时间:2016-07-02 19:11:31

标签: mongoose

我只是想在一个子文档(管理器)数组中返回找到req.user._id的所有文档(站点)。

用户可以管理多个站点,因此我需要一种方法来列出所有这些相关站点。

Site.find({}).elemMatch('managers', {_id: req.user._id}).exec((err, sites) => {
  if (err) {
    console.log(err)
    return res.status(500).send('Something went wrong');
  }
    return res.json(sites)
});

我试过Mongoose elemMatch没有运气。 我无法在任何地方的文档中找到它,但它似乎是一个简单的查询来运行。

(已编辑)以下是示例架构和doc:

import mongoose from 'mongoose';

var Schema = mongoose.Schema;
const SiteSchema = new Schema({
  city: {
           type: String
  },
  siteRef: {
           type: String
  },
  managers: [{
           type: Schema.ObjectId,
             ref: 'User'
  }],
});


export default mongoose.model('Site', SiteSchema);

1 个答案:

答案 0 :(得分:1)

ElemMatch不是最好的查询方法,因为您试图在查询的子网域中进行访问。

我相信您正在寻找mongoose populate

尝试这样的事情:

Site.find().populate('managers', null, req.user._id).exec((err, managers) => {
  if (err) {
      return (err)
  }
    return res.json(sites)
});  

为了更好地了解正在发生的事情,请查看它们提供的示例:

Kitten.find().populate({
    path: 'owner'
  , select: 'name'
  , match: { color: 'black' }
  , options: { sort: { name: -1 }}
}).exec(function (err, kittens) {
  console.log(kittens[0].owner.name) // Zoopa
})

// alternatively
Kitten.find().populate('owner', 'name', null, {sort: { name: -1 }}).exec(function (err, kittens) {
  console.log(kittens[0].owner.name) // Zoopa
})
您的案例中的“路径”将是“经理”,并且您将返回“req.user._id”与模型中任何字段匹配的所有网站。