【问题标题】:How to return documents where value is found in an array? Mongoose.js如何返回在数组中找到值的文档?猫鼬.js
【发布时间】:2016-11-04 22:33:34
【问题描述】:

我只是试图返回在子文档(管理器)数组中找到 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 没有运气。 我无法在任何地方的文档中找到它,但它似乎是一个可以运行的简单查询。

(已编辑)这是一个示例架构和文档:

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

【问题讨论】:

    标签: mongoose


    【解决方案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”与模型中的任何字段匹配的所有站点。

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 2020-07-25
      • 2016-06-19
      • 2021-02-06
      • 1970-01-01
      • 2018-11-28
      相关资源
      最近更新 更多