MongoDB过滤多个子文档
MongoDB filter multi sub-documents
我在 mongo 数据库中有一个这样结构的文档,我想过滤以仅显示活动的子文档:活动的汽车和活动的水果。
{
"name":"Andre",
"fruits":[
{
"active":true,
"fruitname":"apple"
},{
"active":false,
"fruitname":"banana"
}
],
"cars":[
{
"active":false,
"carname":"ford"
},{
"active":true,
"carname":"GM"
},
]
}
这是我想要的结果。
{
"name":"Andre",
"fruits":[
{
"active":true,
"fruitname":"apple"
}
],
"cars":[
{
"active":true,
"carname":"GM"
},
]
}
我试过 Aggregate
但是当任何汽车或任何水果启动时,它 return 什么都没有。
m_object.aggregate([
{ $match : {
"name": "andre"
}},
{ $unwind : "$fruits" },
{ $unwind : "$cars" },
{ $match : {
'fruits.active':{$eq: true}
}},
{ $match : {
'cars.active':{$eq: true}
}},
{ $group : {
"name": "$name",
cars: { $addToSet : "$cars" }
fruits: { $addToSet : "$fruits" }
}}
], function (err, result) {
if (err) {
console.log(err);
return;
}
console.log('result');
});
有什么方法可以省略那些子文档中的"active":false
个子文档吗?
使用以下聚合管道获得所需结果:
var pipeline = [
{
"$match": {
"name": "Andre",
"fruits.active": true,
"cars.active": true
}
},
{ "$unwind": "$fruits" },
{ "$unwind": "$cars" },
{
"$match": {
"fruits.active": true,
"cars.active": true
}
},
{
"$group": {
"_id": {
"_id": "$_id",
"name": "$name"
},
"cars": { "$addToSet" : "$cars" },
"fruits": { "$addToSet" : "$fruits" }
}
},
{
"$project": {
"_id": 0,
"name": "$_id.name",
"cars": 1,
"fruits": 1
}
}
]
m_object.aggregate(pipeline)
.exec(function (err, result) {
if (err) {
console.log(err);
return;
}
console.log('result');
});
或者您可以使用 aggregation pipeline 生成器,如下所示:
m_object.aggregate()
.match({
"name": "Andre",
"fruits.active": true,
"cars.active": true
})
.unwind("fruits")
.unwind("cars")
.match({
"fruits.active": true,
"cars.active": true
})
.group({
"_id": {
"_id": "$_id",
"name": "$name"
},
"cars": { "$addToSet" : "$cars" },
"fruits": { "$addToSet" : "$fruits" }
})
.project({
"_id": 0,
"name": "$_id.name",
"cars": 1,
"fruits": 1
})
.exec(callback);
我在 mongo 数据库中有一个这样结构的文档,我想过滤以仅显示活动的子文档:活动的汽车和活动的水果。
{
"name":"Andre",
"fruits":[
{
"active":true,
"fruitname":"apple"
},{
"active":false,
"fruitname":"banana"
}
],
"cars":[
{
"active":false,
"carname":"ford"
},{
"active":true,
"carname":"GM"
},
]
}
这是我想要的结果。
{
"name":"Andre",
"fruits":[
{
"active":true,
"fruitname":"apple"
}
],
"cars":[
{
"active":true,
"carname":"GM"
},
]
}
我试过 Aggregate
但是当任何汽车或任何水果启动时,它 return 什么都没有。
m_object.aggregate([
{ $match : {
"name": "andre"
}},
{ $unwind : "$fruits" },
{ $unwind : "$cars" },
{ $match : {
'fruits.active':{$eq: true}
}},
{ $match : {
'cars.active':{$eq: true}
}},
{ $group : {
"name": "$name",
cars: { $addToSet : "$cars" }
fruits: { $addToSet : "$fruits" }
}}
], function (err, result) {
if (err) {
console.log(err);
return;
}
console.log('result');
});
有什么方法可以省略那些子文档中的"active":false
个子文档吗?
使用以下聚合管道获得所需结果:
var pipeline = [
{
"$match": {
"name": "Andre",
"fruits.active": true,
"cars.active": true
}
},
{ "$unwind": "$fruits" },
{ "$unwind": "$cars" },
{
"$match": {
"fruits.active": true,
"cars.active": true
}
},
{
"$group": {
"_id": {
"_id": "$_id",
"name": "$name"
},
"cars": { "$addToSet" : "$cars" },
"fruits": { "$addToSet" : "$fruits" }
}
},
{
"$project": {
"_id": 0,
"name": "$_id.name",
"cars": 1,
"fruits": 1
}
}
]
m_object.aggregate(pipeline)
.exec(function (err, result) {
if (err) {
console.log(err);
return;
}
console.log('result');
});
或者您可以使用 aggregation pipeline 生成器,如下所示:
m_object.aggregate()
.match({
"name": "Andre",
"fruits.active": true,
"cars.active": true
})
.unwind("fruits")
.unwind("cars")
.match({
"fruits.active": true,
"cars.active": true
})
.group({
"_id": {
"_id": "$_id",
"name": "$name"
},
"cars": { "$addToSet" : "$cars" },
"fruits": { "$addToSet" : "$fruits" }
})
.project({
"_id": 0,
"name": "$_id.name",
"cars": 1,
"fruits": 1
})
.exec(callback);