Mongodb 如果子数组文档不';你不满足比赛条件吗?
如果子数组文档不满足Mongoose中的匹配条件,Mongoose不会返回对象 MongoDB查询:Mongodb 如果子数组文档不';你不满足比赛条件吗?,mongodb,mongoose,Mongodb,Mongoose,如果子数组文档不满足Mongoose中的匹配条件,Mongoose不会返回对象 MongoDB查询: { _id: "abcdefg", fruitId: "kipld", isActive: true, types :[ { name: "Kashmir Apple", price: 90, isActive: false }, {
{
_id: "abcdefg",
fruitId: "kipld",
isActive: true,
types :[
{
name: "Kashmir Apple",
price: 90,
isActive: false
},
{
name: "American Apple",
price: 120,
isActive: false
}
]
}
{
_id: "abcdefg",
fruitId: "kipld",
isActive: true,
types :[]
}
{
"_id" : "abcdefg",
"fruitId" : "kipld",
"isActive" : true,
"types" : [
{
"name" : "Kashmir Apple",
"price" : 90,
"isActive" : false
},
{
"name" : "American Apple",
"price" : 120,
"isActive" : false
}
]
}
{
"_id" : "uvwxyz",
"fruitId" : "kipld",
"isActive" : true,
"types" : [
{
"name" : "Kinnaur Apple",
"price" : 80,
"isActive" : false
},
{
"name" : "Shimla Apple",
"price" : 70,
"isActive" : true
}
]
}
db.fruits.aggregate([
{ $match: { "isActive": true, fruitId: "kipld" } },
{ $project: { _id: 1, fruitId: 1, isActive: 1,
result_types: { $filter: {
input: "$types",
as: "type",
cond: { $eq: [ "$$type.isActive", true ] }
}
} }
}
])
db.fruits.aggregate(
{$match:{“isActive”:true,水果ID:“kipld”},
{$unwind:'$types'},
{$match:{“types.isActive”:true},
{$group:{
_id:“$\u id”,
名称:{$first:'$name'},
价格:{$first:'$price'},
类型:{$push:'$types'}
}
},
{$项目:{
“_id”:1,
“名称”:1,
"价格":1,,
“类型”:1,
}
}
)
MongoDB系列:
{
_id: "abcdefg",
fruitId: "kipld",
isActive: true,
types :[
{
name: "Kashmir Apple",
price: 90,
isActive: false
},
{
name: "American Apple",
price: 120,
isActive: false
}
]
}
{
_id: "abcdefg",
fruitId: "kipld",
isActive: true,
types :[]
}
{
"_id" : "abcdefg",
"fruitId" : "kipld",
"isActive" : true,
"types" : [
{
"name" : "Kashmir Apple",
"price" : 90,
"isActive" : false
},
{
"name" : "American Apple",
"price" : 120,
"isActive" : false
}
]
}
{
"_id" : "uvwxyz",
"fruitId" : "kipld",
"isActive" : true,
"types" : [
{
"name" : "Kinnaur Apple",
"price" : 80,
"isActive" : false
},
{
"name" : "Shimla Apple",
"price" : 70,
"isActive" : true
}
]
}
db.fruits.aggregate([
{ $match: { "isActive": true, fruitId: "kipld" } },
{ $project: { _id: 1, fruitId: 1, isActive: 1,
result_types: { $filter: {
input: "$types",
as: "type",
cond: { $eq: [ "$$type.isActive", true ] }
}
} }
}
])
预期结果如下:
{
_id: "abcdefg",
fruitId: "kipld",
isActive: true,
types :[
{
name: "Kashmir Apple",
price: 90,
isActive: false
},
{
name: "American Apple",
price: 120,
isActive: false
}
]
}
{
_id: "abcdefg",
fruitId: "kipld",
isActive: true,
types :[]
}
{
"_id" : "abcdefg",
"fruitId" : "kipld",
"isActive" : true,
"types" : [
{
"name" : "Kashmir Apple",
"price" : 90,
"isActive" : false
},
{
"name" : "American Apple",
"price" : 120,
"isActive" : false
}
]
}
{
"_id" : "uvwxyz",
"fruitId" : "kipld",
"isActive" : true,
"types" : [
{
"name" : "Kinnaur Apple",
"price" : 80,
"isActive" : false
},
{
"name" : "Shimla Apple",
"price" : 70,
"isActive" : true
}
]
}
db.fruits.aggregate([
{ $match: { "isActive": true, fruitId: "kipld" } },
{ $project: { _id: 1, fruitId: 1, isActive: 1,
result_types: { $filter: {
input: "$types",
as: "type",
cond: { $eq: [ "$$type.isActive", true ] }
}
} }
}
])
但是,当我运行上述查询时,我没有得到任何结果。您可以使用聚合运算符获得所需的结果。这只是过滤所有数组元素并返回具有匹配过滤条件的数组。注意:过滤器应用于每个文档的数组。因此,在您的情况下,不需要使用
$unwind
和$group
阶段来获得结果
样品水果
收集:
{
_id: "abcdefg",
fruitId: "kipld",
isActive: true,
types :[
{
name: "Kashmir Apple",
price: 90,
isActive: false
},
{
name: "American Apple",
price: 120,
isActive: false
}
]
}
{
_id: "abcdefg",
fruitId: "kipld",
isActive: true,
types :[]
}
{
"_id" : "abcdefg",
"fruitId" : "kipld",
"isActive" : true,
"types" : [
{
"name" : "Kashmir Apple",
"price" : 90,
"isActive" : false
},
{
"name" : "American Apple",
"price" : 120,
"isActive" : false
}
]
}
{
"_id" : "uvwxyz",
"fruitId" : "kipld",
"isActive" : true,
"types" : [
{
"name" : "Kinnaur Apple",
"price" : 80,
"isActive" : false
},
{
"name" : "Shimla Apple",
"price" : 70,
"isActive" : true
}
]
}
db.fruits.aggregate([
{ $match: { "isActive": true, fruitId: "kipld" } },
{ $project: { _id: 1, fruitId: 1, isActive: 1,
result_types: { $filter: {
input: "$types",
as: "type",
cond: { $eq: [ "$$type.isActive", true ] }
}
} }
}
])
聚合查询:
{
_id: "abcdefg",
fruitId: "kipld",
isActive: true,
types :[
{
name: "Kashmir Apple",
price: 90,
isActive: false
},
{
name: "American Apple",
price: 120,
isActive: false
}
]
}
{
_id: "abcdefg",
fruitId: "kipld",
isActive: true,
types :[]
}
{
"_id" : "abcdefg",
"fruitId" : "kipld",
"isActive" : true,
"types" : [
{
"name" : "Kashmir Apple",
"price" : 90,
"isActive" : false
},
{
"name" : "American Apple",
"price" : 120,
"isActive" : false
}
]
}
{
"_id" : "uvwxyz",
"fruitId" : "kipld",
"isActive" : true,
"types" : [
{
"name" : "Kinnaur Apple",
"price" : 80,
"isActive" : false
},
{
"name" : "Shimla Apple",
"price" : 70,
"isActive" : true
}
]
}
db.fruits.aggregate([
{ $match: { "isActive": true, fruitId: "kipld" } },
{ $project: { _id: 1, fruitId: 1, isActive: 1,
result_types: { $filter: {
input: "$types",
as: "type",
cond: { $eq: [ "$$type.isActive", true ] }
}
} }
}
])
输出:
{
_id: "abcdefg",
fruitId: "kipld",
isActive: true,
types :[
{
name: "Kashmir Apple",
price: 90,
isActive: false
},
{
name: "American Apple",
price: 120,
isActive: false
}
]
}
{
_id: "abcdefg",
fruitId: "kipld",
isActive: true,
types :[]
}
{
"_id" : "abcdefg",
"fruitId" : "kipld",
"isActive" : true,
"types" : [
{
"name" : "Kashmir Apple",
"price" : 90,
"isActive" : false
},
{
"name" : "American Apple",
"price" : 120,
"isActive" : false
}
]
}
{
"_id" : "uvwxyz",
"fruitId" : "kipld",
"isActive" : true,
"types" : [
{
"name" : "Kinnaur Apple",
"price" : 80,
"isActive" : false
},
{
"name" : "Shimla Apple",
"price" : 70,
"isActive" : true
}
]
}
db.fruits.aggregate([
{ $match: { "isActive": true, fruitId: "kipld" } },
{ $project: { _id: 1, fruitId: 1, isActive: 1,
result_types: { $filter: {
input: "$types",
as: "type",
cond: { $eq: [ "$$type.isActive", true ] }
}
} }
}
])
注意“结果类型”空数组,其中对于“类型”数组的所有元素,types.isActive
值为false
。结果输出中只有值为true
的元素
{
"_id" : "abcdefg",
"fruitId" : "kipld",
"isActive" : true,
"result_types" : [ ]
}
{
"_id" : "uvwxyz",
"fruitId" : "kipld",
"isActive" : true,
"result_types" : [
{
"name" : "Shimla Apple",
"price" : 70,
"isActive" : true
}
]
}
您的查询显示
{$match:{“types.isActive”:true}
,但输入文档的“tyoes.isActive”
值为false
。因此,未选择任何文档。这是预期的行为。如果不存在true
记录,我可以这样做以返回空数组吗?您可以在此处检查:@Rajath You can。但是,您使用的查询管道不是这样的。谢谢,prasad,我用同样的方法实现了它