2014-02-21 95 views
0

我有这样的对象的集合:获取蒙戈集合中从嵌套的数组元素的特定值

{ 
    "_id": ObjectId("52ed12c144aecc4bf004d0b6"), 
    "title": "myBook", 
    "summary": "This is a book summary", 
    "covers": [ 
    "http://url.com/cover1.jpg", 
    "http://url.com/cover2.jpg", 
    ], 
    "urls": [ 
    "http://url.com/myBook", 
    "http://url.com/myBook/option2" 
    ], 
    "genres": [ 
    "comedy", 
    "romantic" 
    ], 
    "created_at": ISODate("2012-12-17T23:00:00Z"), 
    "modify_at": ISODate("2014-02-01T15:41:48.149Z") 
} 

但我只想要得到的第一个值从涵盖网址属性,我的输出JSON应该是这样的:

{ 
    "_id": ObjectId("52ed12c144aecc4bf004d0b6"), 
    "title": "myBook", 
    "summary": "This is a book summary", 
    "covers": "http://url.com/cover1.jpg", 
    "urls": "http://url.com/myBook" 
    "genres": [ 
    "comedy", 
    "romantic" 
    ], 
    "created_at": ISODate("2012-12-17T23:00:00Z"), 
    "modify_at": ISODate("2014-02-01T15:41:48.149Z") 
} 

我想我必须使用map_reduce,但我不知道我应该怎么查询的,我想:

db.books.mapReduce(function(){ emit(this._id, this.covers); }, function(key, values){ return values[0]; }, { out: "map_reduce_covers" })

但这似乎并不奏效。

回答

0

您可以使用$slice投影算子来控制输出中包含阵列的哪些元素。

db.books.findOne({}, {covers: {$slice: 1}, urls: {$slice: 1}}) 

输出:

{ 
    "_id": ObjectId("52ed12c144aecc4bf004d0b6"), 
    "title": "myBook", 
    "summary": "This is a book summary", 
    "covers": [ 
    "http://url.com/cover1.jpg" 
    ], 
    "urls": [ 
    "http://url.com/myBook" 
    ], 
    "genres": [ 
    "comedy", 
    "romantic" 
    ], 
    "created_at": ISODate("2012-12-17T17:00:00-0600"), 
    "modify_at": ISODate("2014-02-01T09:41:48.149-0600") 
} 

coversurls仍阵列,它得到,如果你也想改变这种状况更加复杂。