Tob*_*ães 4 mongoose mongodb node.js
您好,我正在尝试在 MongoDB 中查询一些嵌套文档。我使用猫鼬..我的文件就像
[
{
"_id": "5a2ca2227c42ad67682731d4",
"description": "some descrition",
"photos": [
{
"_id": "5a2ca22b7c42ad67682731d5",
"approved": false,
"text":"good"
},
{
"_id": "5a2ca72b0a1aa173aaae07da",
"approved": true,
"text":"bad"
},
{
"_id": "5a2cabf85a41077a2f87d4e3",
"approved": false,
"text":"bad"
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
我只想在文本属性中找到值为“good”的照片,这是我的查找代码:
ObjectSchema.find({
'photos': {
$elemMatch : {
'text' : 'good'
}
}
},function(err,result){
console.log(result);
});
Run Code Online (Sandbox Code Playgroud)
我只想返回具有与我的查询匹配的值的元素的对象,但是当此列表中的一个对象匹配时,整个照片列表都会附带结果,而不仅仅是与文本匹配的人.. 我如何查询它,并只带上匹配的元素,在这种情况下,只带文本中具有“好”的元素。
我使用 nodejs + 猫鼬
谢谢!
您仅使用find条件,这将返回整个文档。您还可以指定投影以find在文档中包含/排除某些字段。您可以在投影中使用 $elemMatch ,如下所示:
ObjectSchema.find({
'photos': {
$elemMatch : {
'text' : 'good'
}
}
}, {
'photos': {
$elemMatch : {
'text' : 'good'
}
}
}, function(err,result){
console.log(result);
});
Run Code Online (Sandbox Code Playgroud)
但请注意,投影中的$elemMatch 将仅包含第一个匹配的数组元素。根据示例文档,这可能不是您想要的。相反,您可以使用聚合框架。您可以从以下内容(未经测试)开始,并根据需要调整输出:
ObjectSchema.aggregate(
{$unwind: "$photos"},
{$match: {"photos.text": "good"}},
function(err,result){
console.log(result);
}
)
Run Code Online (Sandbox Code Playgroud)
其中$unwind为数组的每个元素创建一个单独的文档。
要按照您在评论中的描述塑造输出,您需要使用$group 聚合。尝试将类似于以下内容的 $group 聚合添加到管道的末尾:
{$group: {_id: "$_id", photos: {$push: "$photos"}}}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10825 次 |
| 最近记录: |