在文档数组猫鼬中获取精确的子文档

时间:2019-05-19 17:25:05

标签: javascript node.js database mongoose

我正在开发使用mongoose与我的mongo数据库进行交互的graphql API,并且正在为某些事情而苦苦挣扎。我有带有subdocuments数组的文档,我需要获取所有包含具有特定字段值的subdocument的文档。问题是我只想在文档中获得此子文档。举个例子更容易解释:

我的文档是这样的:

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 }
    }
  },
});

这样做是为了获得正确的文档,但是它包含所有项目,而不仅仅是符合条件的项目。我正在寻找解决方案,但没有找到任何解决办法。

感谢您的帮助,希望它已经足够清楚了。

2 个答案:

答案 0 :(得分:1)

您将需要使用聚合框架,如下所示:

db.test.aggregate(
{ $match: { "id": 1 }}, 
{ $unwind: '$items' }, 
{ $match: { "items.value": 5 }},
{ $project: { "_id": 0 }}
)

返回值:

{ "id" : 1, "items" : { "value" : 5 } }

答案 1 :(得分:0)

您需要指定要从查询中返回的字段。

documents.find({
    items: {
      $elemMatch : {
        value: { $eq: 5 }
      }
    },
  }, {requiredFields: 1});

请参阅this问题中的示例。

官方文档:here-搜索“选择”

如果您也需要过滤结果,则可以使用$filter