Javascript Mongo只返回数组匹配查询的元素

Javascript Mongo只返回数组匹配查询的元素,javascript,arrays,mongodb,Javascript,Arrays,Mongodb,给出以下JSON示例: { _id: "55ef729a66d78d24008xxxx", name: "The right one" items: [{ _id: "55ef729a66d78d24008xxxx", return: true }, { _id: "55ef729a66d78d24008xxxx", return: true }, { _id: "55ef72

给出以下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,比如这个,但正如它所说的,这个

只返回第一场比赛

但这只是返回在数组中具有某些值的父文档,这些值与items.return匹配。因此,在上面的示例中,它将返回所有3个数组元素


我希望在返回中完全忽略这些数组值。我不想在客户机中这样做,因为我使用项目id进行项目,如果我不需要它,我不想浪费项目。

备选方案不完全符合您的要求

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

您可以使用聚合框架,但它不是最好的解决方案

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

一种选择是使用
$elemMatch
。检查,值得注意的是它只返回第一个匹配

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

不同的问题,这个问题指的是返回具有匹配的精确数组的父文档,我需要更改数组本身。这不是问题,而是问题的答案。这里有几个答案,它们使用聚合框架只返回匹配的“元素”,因为这是唯一能够这样做的工具(除了map reduce)。来自审阅队列:我可以请求您在源代码周围添加一些上下文吗。只有代码的答案很难理解。如果你能在你的文章中添加更多的信息,这将有助于询问者和未来的读者。