精确减少功能

时间:2013-07-29 12:40:04

标签: mongodb mapreduce mongo-java

我有一个类型的集合:

{
  "_id" : ObjectId("51f1fcc08188d3117c6da351"),
  "cust_id" : "abc123",
  "ord_date" : ISODate("2012-10-03T18:30:00Z"),
  "status" : "A",
  "price" : 25,
  "items" : [{
  "sku" : "ggg",
  "qty" : 7,
  "price" : 2.5
}, {
  "sku" : "ppp",
  "qty" : 5,
  "price" : 2.5
}]
}

我只想获取“items.qty”> 5和“items.sku”==“ggg”的“items”对象。

我应用了Map reduce:

cmd { "mapreduce" : "orders" , "map" : "function map(){var items_out={items:[]};for(i in this.items){items_out.items.push(this.items[i].sku);};emit(this._id,[items_out]);}" , "reduce" : "function reduce(key,values){return {'result':values};}" , "verbose" : true , "out" : { "replace" : "map_reduce"} , "query" : { "$where" : "return this.items.some(function(entry){return entry.qty>5})&&this.items.some(function(entry){return entry.sku=='ggg'})"}}, 

但我得到的所有sku值都是这样的:

{ "data": [  {     "items": [     "ggg",      "ppp"     ]     }    ]}

它应该只提供ggg,因为这是唯一的值匹配标准。

1 个答案:

答案 0 :(得分:0)

使用以下命令:

db.orders.aggregate(
{$unwind : "$items"},
{$match : {"items.qty": {$gt: 5 }}},
{$match : {"items.sku" : "ggg"}},
{$project : {_id:0, items:1}}
)