Mongodb查询document里的数组,只返回匹配到的数组元素

需求

在mongodb的集合里有以下这些document:

{  
   "_id":ObjectId("xxxxx"),
   "shapes":[  
      { "shape":"square","color":"blue"},
      { "shape":"circle","color":"red"}
   ]
},
{  
   "_id":ObjectId("xxxx"),
   "shapes":[  
      { "shape":"square","color":"black"},
      { "shape":"circle","color":"green"}
   ]
}

现在查询shapes.clore为red,希望返回:

{ "shapes": 
  [
    {"shape": "circle", "color": "red"}
  ] 
}

而不是返回整个shapes文档。

解决方案

$操作符

mongodb 2.2也可以使用$操作符:

db.test.find({"shapes.color": "red"}, {_id: 0, 'shapes.$': 1});

$elemMatch

mongodb 2.2可以使用$elemMatch操作符,它只会返回数组里匹配到的第一个元素:

db.test.find(
    {"shapes.color": "red"}, 
    {_id: 0, shapes: {$elemMatch: {color: "red"}}});

$filter

Mongodb3.2开始可以使用$filter对数组进行过滤:

db.test.aggregate([
    {$match: {'shapes.color': 'red'}},
    {$project: {
        shapes: {$filter: {
            input: '$shapes',
            as: 'shape',
            cond: {$eq: ['$$shape.color', 'red']}
        }},
        _id: 0
    }}
])

版权声明:著作权归作者所有。

相关推荐

JavaScript删除数组里重复的元素

JavaScript里有多种方法可以用来对数组元素去重。ES6 SetES6提供了一个Set对象,用它可以很简单便可以对数组元素去重。function uniq(arr) {    return Array.from(new Set(arr)); } filter另外也可以通过filter来对数组元素去重。functi

Python:查询列表给定元素的索引

单一索引列表的index()函数返回列表里第一次遇到给定元素的索引。>>> ["a", "b", "c"].index("b") 1 多个索引如果需要返回给定元素的所有索引,则要遍历列表:indexes = [index for i

Kotlin:数组的基本操作

Kotlin使用Array类来表示数组,构造函数为:<init> Array(size: Int, init: (Int) -> T) size:数组大小init:初始化数组创建数组Kotlin提供了几种方法方便我们创建数组,包括:构造函数,标准库提供的arrayOf, arrayOfNulls 和emptyArray等 。构造函数// 创建 一个值