如何通过 mongoose 中的查询 ref 对象获取数据
How to get data by query ref object in mongoose
我有一个问题,没能找到我要找的东西。
我也有这个 Ads
参考其他人的模式:
link: {
type: String,
default: 'n/a',
},
page: {
type: mongoose.Schema.ObjectId,
ref: 'AdsPage',
required: true,
},
slot: {
type: mongoose.Schema.ObjectId,
ref: 'AdsSlot',
required: true,
},
我想通过在 page
属性 上应用条件来获取数据,page
是一个包含 url 属性 的模式。
页面架构:
{
title: {
type: String,
required: [true, 'Please add page title'],
unique: true,
trim: true,
maxlength: [50, 'Name cannot be more then 50 characters'],
},
url: {
type: String,
required: [true, 'Add page URL'],
},
createdAt: {
type: Date,
default: Date.now,
},
},
我想获取与提供的页面 url 相匹配的所有广告。
我的查询如下:
if (req.params.pageUrl) {
const ads = await Ads.find({
'page.url': req.params.pageUrl,
});
return res.status(200).json({
success: true,
message: 'Successfully fetched ads for specific page',
count: ads.length,
data: ads,
});
}
参数中的 页 url 很好,但不知何故这个过滤器不起作用,我没有错误,但结果为零。
我试过 $match
属性 但遇到了一些上层错误。
非常感谢任何有关查询嵌套 ref 对象的帮助。
您可以使用 aggregate
和 $lookup
来完成。您可以在 aggregation.
中查看更多详细信息
输出的 ads_pages
就是你的 adspages
。聚合数组中的第一个元素 $lookup
将帮助您找到所有匹配条件,其中 _id
在广告页面中等于 page
在广告中 url
在 adspage
中等于您的req.params.pageUrl
.
聚合数组中的第二个元素,$match
将帮助您删除包含空 ads_pages 的文档,这意味着它的条件与上述条件不匹配。您可以使用此 https://jsfiddle.net/cuxvd2pm 进行测试。
await AdsModel.aggregate([
{
$lookup: {
// This name must be same as your collection name "in the mongodb"
// In my case, I must use lowercase string, and add more extra "s" in the end
// If you didn't modify extra configuration, I think you should also do it.
from: "adspages",
// you could use as: "page" to replace the original field
as: "ads_pages",
let: { "page_id": "$page"},
pipeline: [{
$match: {
$expr: {
$and: [
{$eq: ["$url", req.params.pageUrl]},
{$eq: ["$_id", "$$page_id"]}
]
}
}
}]
}
},
{
$match: {
// when you change your `as field` to page
// you should also change `ads_pages.0` to `page.0`
"ads_pages.0": {
$exists: true
}
}
}
])
我有一个问题,没能找到我要找的东西。
我也有这个 Ads
参考其他人的模式:
link: {
type: String,
default: 'n/a',
},
page: {
type: mongoose.Schema.ObjectId,
ref: 'AdsPage',
required: true,
},
slot: {
type: mongoose.Schema.ObjectId,
ref: 'AdsSlot',
required: true,
},
我想通过在 page
属性 上应用条件来获取数据,page
是一个包含 url 属性 的模式。
页面架构:
{
title: {
type: String,
required: [true, 'Please add page title'],
unique: true,
trim: true,
maxlength: [50, 'Name cannot be more then 50 characters'],
},
url: {
type: String,
required: [true, 'Add page URL'],
},
createdAt: {
type: Date,
default: Date.now,
},
},
我想获取与提供的页面 url 相匹配的所有广告。
我的查询如下:
if (req.params.pageUrl) {
const ads = await Ads.find({
'page.url': req.params.pageUrl,
});
return res.status(200).json({
success: true,
message: 'Successfully fetched ads for specific page',
count: ads.length,
data: ads,
});
}
参数中的 页 url 很好,但不知何故这个过滤器不起作用,我没有错误,但结果为零。
我试过 $match
属性 但遇到了一些上层错误。
非常感谢任何有关查询嵌套 ref 对象的帮助。
您可以使用 aggregate
和 $lookup
来完成。您可以在 aggregation.
输出的 ads_pages
就是你的 adspages
。聚合数组中的第一个元素 $lookup
将帮助您找到所有匹配条件,其中 _id
在广告页面中等于 page
在广告中 url
在 adspage
中等于您的req.params.pageUrl
.
聚合数组中的第二个元素,$match
将帮助您删除包含空 ads_pages 的文档,这意味着它的条件与上述条件不匹配。您可以使用此 https://jsfiddle.net/cuxvd2pm 进行测试。
await AdsModel.aggregate([
{
$lookup: {
// This name must be same as your collection name "in the mongodb"
// In my case, I must use lowercase string, and add more extra "s" in the end
// If you didn't modify extra configuration, I think you should also do it.
from: "adspages",
// you could use as: "page" to replace the original field
as: "ads_pages",
let: { "page_id": "$page"},
pipeline: [{
$match: {
$expr: {
$and: [
{$eq: ["$url", req.params.pageUrl]},
{$eq: ["$_id", "$$page_id"]}
]
}
}
}]
}
},
{
$match: {
// when you change your `as field` to page
// you should also change `ads_pages.0` to `page.0`
"ads_pages.0": {
$exists: true
}
}
}
])