Mongo仅返回与查询匹配的数组元素

5
给定以下JSON示例:
{
    _id: "55ef729a66d78d24008xxxx",
    name: "The right one"
    items: [{
        _id: "55ef729a66d78d24008xxxx",
        return: true
    }, {
        _id: "55ef729a66d78d24008xxxx",
        return: true
    }, {
        _id: "55ef729a66d78d24008xxxx",
        return: false
    }]
}

我想编写一个查询,指定 items.return = true,并返回以下内容:
{
    _id: "55ef729a66d78d24008xxxx",
    name: "The right one"
    items: [// 2 element array]
}

我看到很多人建议使用 $elemMatch,例如这个问题,但正如它所说,这只会返回第一个匹配项,而不是忽略数组中所有其他匹配项。因此,在上面的例子中,它将返回所有3个数组元素。
我想完全忽略这些数组值,在返回结果中不要包括它们。我不想在客户端处理它,因为我使用items _id进行项目,并且不想浪费项目如果我不需要它。

不同的问题,那个问题是指返回具有完全匹配数组的父文档,我需要改变数组本身。 - KJ3
重点不在于问题,而在于问题所提供的答案。有几个答案使用聚合框架来仅返回匹配的“元素”,因为这是唯一能够实现此操作的工具(除了映射/约简之外)。 - Blakes Seven
3个回答

3

你可能不需要完全相同的替代方案

db.items.aggregate(
      {$unwind:"$items"},
      {$match:{"items.return":true}}
)

2

一种替代方法是使用$elemMatch。请查看文档,需要注意的是它只返回第一个匹配项!

db.items.find({}, {items: {$elemMatch: {return: "admin"}}}});

1
从审核队列中:我可以请求您在源代码周围添加一些上下文吗?仅有代码的答案很难理解。如果您能在帖子中添加更多信息,这将有助于提问者和未来的读者。 - RBT

1

您可以使用聚合框架,虽然这不是最佳解决方案。

db.collection.aggregate([
      {$unwind:'$items'},
      {$match:{'items.return':true}},
      {$group:{_id:'$_id', name: '$name',items:{$push:'$items'}}}
])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接