我只是想在一个子文档(管理器)数组中返回找到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);
答案 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”与模型中任何字段匹配的所有网站。