我正在使用mongoose开发一个graphql api,以与我的蒙哥数据库进行交互,而我正在努力与某些东西进行挣扎。我有带有子图数阵列的文档,我需要获取所有包含具有特定字段值的子文件的文档。问题是我只想在文档中获取此子记录。用一个示例更容易解释:
我的文档就是这样:
documents: [
{
id: 1,
items: [
{
value: 5,
},
{
value: 10,
},
]
},
{
id: 2,
items: [
{
value: 7,
},
{
value: 10,
},
]
}]
我想获取所有带有value == 5
项目的文档,但仅包含此值,例如:
results : [
{
id: 1,
items: [
{
value: 5,
}
]
}]
我现在要做的是:
documents.find({
items: {
$elemMatch : {
value: { $eq: 5 }
}
},
});
这样做的是我得到了正确的文档,但它包含了所有项目,而不仅仅是与条件匹配的项目。我寻找解决方案,但没有找到任何事情。
感谢您的帮助,希望它足够清楚。
您需要使用聚合框架如下:
db.test.aggregate(
{ $match: { "id": 1 }},
{ $unwind: '$items' },
{ $match: { "items.value": 5 }},
{ $project: { "_id": 0 }}
)
返回值:
{ "id" : 1, "items" : { "value" : 5 } }
您需要指定要从查询返回的字段。
documents.find({
items: {
$elemMatch : {
value: { $eq: 5 }
}
},
}, {requiredFields: 1});
参见此问题中的示例。
官方文档:此处 - 搜索"选择"
如果您也需要过滤结果,则使用$ filter