Nodejs mongoose select 对象具有基于对象属性的嵌套数组
Nodejs mongoose select objects with in nested arrays based on object properties
我是 nodejs 的新手,目前我正在尝试使用 nodejs 和 mongodb (mongoose) 来实现一个网络应用程序。
我想 select 基于这些对象的 属性 个嵌套数组和父数组中的对象。
简单 - 我需要 select 具有有效 属性 的类别和 sub_services 具有有效 属性 的类别。 (在一个类别中,不能有 sub_services 有效 属性 为假,也不能有类别对象有效 属性 为假。)
架构
var VendorSchema = new Schema({
_id: {
type: Schema.Types.ObjectId,
ref: "User"
},
services: {
meta_data: {
allowed_category_count: {
type: Number,
default: 1
}
},
categories: [{
_id:false,
valid :{
type: Boolean,
default: false
},
service_category: {
type: Schema.Types.ObjectId,
ref: "ServiceCategory"
},
sub_services :[{
_id:false,
valid :{
type: Boolean,
default: false
},
service : {
type: Schema.Types.ObjectId,
ref: "Service"
}
}]
}]
},
});
查询
router.get('/get_service_details',function(req, res) {
Vendor.findOne({ _id: req.user._id,'services.categories.valid': true,'services.categories.sub_services.valid': true},'services').
exec(function (err, story) {
if (err) {
console.log(err);
return (err);
}
else{
res.send(story);
}
})
});
上述查询的结果
{
"_id": "5a62ea5d7515222464e20016",
"services": {
"categories": [
{
"service_category": {
"_id": "5a609b40c9a5e50d844838bf"
},
"sub_services": [
{
"service": {
"_id": "5a609f7ac9a5e50d844838c1"
},
"valid": true
},
{
"service": {
"_id": "5a609f7ac9a5e50d844838c1"
}
"valid": false
}
],
"valid": true
},
{
"service_category": {
"_id": "5a609b4ac9a5e50d844838c0"
},
"sub_services": [
{
"service": {
"_id": "5a609f84c9a5e50d844838c2"
}
"valid": true
}
],
"valid": false
}
]
}
}
预期结果
{
"_id": "5a62ea5d7515222464e20016",
"services": {
"categories": [
{
"service_category": {
"_id": "5a609b40c9a5e50d844838bf"
},
"sub_services": [
{
"service": {
"_id": "5a609f7ac9a5e50d844838c1"
},
"valid": true
}
],
"valid": true
}
]
}
}
谁能帮我解决这个问题。
使用 $filter
表达式过滤类别作为 $map
的输入,将输出值映射到 $filter
ed sub_services。
Vendor.aggregate([
{"$match":{"_id":mongoose.Types.ObjectId(req.user._id), "services.categories.valid": true, "services.categories.sub_services.valid": true}},
{
"$addFields": {
"services.categories": {
"$map": {
"input": {
"$filter": {
"input": "$services.categories",
"as": "categoryf",
"cond": "$$categoryf.valid"
}
},
"as": "categorym",
"in": {
"service_category": "$$categorym.service_category",
"valid": "$$categorym.valid",
"sub_services":{
"$filter": {
"input": "$$categorym.sub_services",
"as": "sub_services",
"cond": "$$sub_services.valid"
}
}
}
}
}
}
}
])
我是 nodejs 的新手,目前我正在尝试使用 nodejs 和 mongodb (mongoose) 来实现一个网络应用程序。
我想 select 基于这些对象的 属性 个嵌套数组和父数组中的对象。
简单 - 我需要 select 具有有效 属性 的类别和 sub_services 具有有效 属性 的类别。 (在一个类别中,不能有 sub_services 有效 属性 为假,也不能有类别对象有效 属性 为假。)
架构
var VendorSchema = new Schema({
_id: {
type: Schema.Types.ObjectId,
ref: "User"
},
services: {
meta_data: {
allowed_category_count: {
type: Number,
default: 1
}
},
categories: [{
_id:false,
valid :{
type: Boolean,
default: false
},
service_category: {
type: Schema.Types.ObjectId,
ref: "ServiceCategory"
},
sub_services :[{
_id:false,
valid :{
type: Boolean,
default: false
},
service : {
type: Schema.Types.ObjectId,
ref: "Service"
}
}]
}]
},
});
查询
router.get('/get_service_details',function(req, res) {
Vendor.findOne({ _id: req.user._id,'services.categories.valid': true,'services.categories.sub_services.valid': true},'services').
exec(function (err, story) {
if (err) {
console.log(err);
return (err);
}
else{
res.send(story);
}
})
});
上述查询的结果
{
"_id": "5a62ea5d7515222464e20016",
"services": {
"categories": [
{
"service_category": {
"_id": "5a609b40c9a5e50d844838bf"
},
"sub_services": [
{
"service": {
"_id": "5a609f7ac9a5e50d844838c1"
},
"valid": true
},
{
"service": {
"_id": "5a609f7ac9a5e50d844838c1"
}
"valid": false
}
],
"valid": true
},
{
"service_category": {
"_id": "5a609b4ac9a5e50d844838c0"
},
"sub_services": [
{
"service": {
"_id": "5a609f84c9a5e50d844838c2"
}
"valid": true
}
],
"valid": false
}
]
}
}
预期结果
{
"_id": "5a62ea5d7515222464e20016",
"services": {
"categories": [
{
"service_category": {
"_id": "5a609b40c9a5e50d844838bf"
},
"sub_services": [
{
"service": {
"_id": "5a609f7ac9a5e50d844838c1"
},
"valid": true
}
],
"valid": true
}
]
}
}
谁能帮我解决这个问题。
使用 $filter
表达式过滤类别作为 $map
的输入,将输出值映射到 $filter
ed sub_services。
Vendor.aggregate([
{"$match":{"_id":mongoose.Types.ObjectId(req.user._id), "services.categories.valid": true, "services.categories.sub_services.valid": true}},
{
"$addFields": {
"services.categories": {
"$map": {
"input": {
"$filter": {
"input": "$services.categories",
"as": "categoryf",
"cond": "$$categoryf.valid"
}
},
"as": "categorym",
"in": {
"service_category": "$$categorym.service_category",
"valid": "$$categorym.valid",
"sub_services":{
"$filter": {
"input": "$$categorym.sub_services",
"as": "sub_services",
"cond": "$$sub_services.valid"
}
}
}
}
}
}
}
])