【问题标题】:Mongo Only Return Elements of Array Matching Query [duplicate]Mongo仅返回数组匹配查询的元素[重复]
【发布时间】:2016-01-26 00:13:52
【问题描述】:

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

只返回第一个匹配项

但这只是返回在数组匹配items.return中有一些值的父文档。所以在上面的例子中,它将返回所有 3 个数组元素。

我想在返回时完全忽略这些数组值。我不想在客户端做,因为我用items _id做一个项目,如果我不需要它不想浪费这个项目。

【问题讨论】:

  • 不同的问题,这个问题是指返回的父文档具有完全匹配的数组,我需要更改数组本身。
  • 这与问题无关,而是针对问题提供的答案。那里有几个答案使用聚合框架只返回匹配的“元素”,因为这是唯一能够这样做的工具(除了 map reduce )。

标签: javascript arrays mongodb


【解决方案1】:

替代方案不完全是你想要的

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

【讨论】:

    【解决方案2】:

    另一种方法是使用$elemMatch。查看docs,值得注意的是它只返回first匹配!

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

    【讨论】:

    • 来自审核队列:我可以请求您在源代码周围添加一些上下文。仅代码的答案很难理解。如果您可以在帖子中添加更多信息,这将对提问者和未来的读者都有帮助。
    【解决方案3】:

    你可以使用聚合框架,虽然它不是最好的解决方案

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

    【讨论】:

      猜你喜欢
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 2013-01-22
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 2015-05-27
      相关资源
      最近更新 更多