问题描述
我只需要子文档数组数据的结果,通过条件
样本数据 [2 个文档]
{
_id : ObjectId("512e28984815cbfcb21646a7"),name: David,list: [
{
sport: basketball,score: 100
},{
sport: cricket,score: 30
}
{
sport: rugby,score: 100
}
]
},{
_id : ObjectId("879e28664815cbfcb21622g9"),name: Shawn,score: 50
}
{
sport: rugby,score: 20
}
]
}
预期结果
David 得分为 100 的游戏列表
回复:[篮球、橄榄球]
查询尝试但结果为NULL
findOne({name:'David',"list.score": 100})
解决方法
要获取大卫得分为 100 的游戏列表,您应该这样做:
const user = await User.findOne({name:'David'})
if (user){
const games = user.list.filter(el => el.score === 100)
console.log(games)
}
,
您可以使用聚合管道。
- 名称使用简单的
$match
- 对于数组使用
$filter
函数
会是这个:
db.collection.aggregate([
{ $match: { name: "David" } },{
$set: {
list: {
$filter: {
input: "$list",cond: {$eq: ["$$this.score",100] }
}
}
}
}
])
,
使用elemMatch投影运算符来限制数组的元素:
await User.findOne({name:'David','list.score': 100}).select({list:{$elemMatch:{score:100}})
该示例文档似乎没有在字符串周围显示引号。
请注意,{score:100}
仅在值为数字时才匹配,即它不会匹配 {sport: "basketball",score:"100"}
只是对已接受答案的充值
匹配和设置聚合代码也可以从 MongoDB 指南针中生成
Compass 的“聚合”选项卡 --> 导出到语言按钮