Mongodb 通过单个查询在 Document 和 subDocument 中搜索
Mongodb search in Document and subDocument through single query
我有一个包含数组子文档的文档
我需要通过单个查询
搜索文档和子文档
我只需要子文档数组数据的结果,通过条件
示例数据 [2 个文档]
{
_id : ObjectId("512e28984815cbfcb21646a7"),
name: David,
list: [
{
sport: basketball,
score: 100
},
{
sport: cricket,
score: 30
}
{
sport: rugby,
score: 100
}
]
},
{
_id : ObjectId("879e28664815cbfcb21622g9"),
name: Shawn,
list: [
{
sport: basketball,
score: 100
},
{
sport: cricket,
score: 50
}
{
sport: rugby,
score: 20
}
]
}
预期结果
大卫得分为 100 的游戏列表
- 文献查询name=David
- 子文档查询score = 100
回复:[篮球,橄榄球]
已尝试查询,但结果为 NULL
findOne({name:'David', "list.score": 100})
要获得 David 得分为 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 的聚合选项卡 --> 导出到语言按钮
我有一个包含数组子文档的文档
我需要通过单个查询
搜索文档和子文档我只需要子文档数组数据的结果,通过条件
示例数据 [2 个文档]
{
_id : ObjectId("512e28984815cbfcb21646a7"),
name: David,
list: [
{
sport: basketball,
score: 100
},
{
sport: cricket,
score: 30
}
{
sport: rugby,
score: 100
}
]
},
{
_id : ObjectId("879e28664815cbfcb21622g9"),
name: Shawn,
list: [
{
sport: basketball,
score: 100
},
{
sport: cricket,
score: 50
}
{
sport: rugby,
score: 20
}
]
}
预期结果
大卫得分为 100 的游戏列表
- 文献查询name=David
- 子文档查询score = 100
回复:[篮球,橄榄球]
已尝试查询,但结果为 NULL
findOne({name:'David', "list.score": 100})
要获得 David 得分为 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 的聚合选项卡 --> 导出到语言按钮