2016-09-15 120 views
0

MongoDB的总我有一个包含文档一个蒙戈集合像这样:有额外的信息

{ 
    "_id" : ObjectId("57697321c22d3917acd66513"), 
    "parent" : "AlphaNumericID", 
    "signature" : "AnotherAlphaNumericID", 
    "price" : 1638, 
    "url" : "http://www.thecompany.com/path/to/page1", 
    "date" : ISODate("2016-06-21T17:02:20.352Z"), 
    "valid" : true 
} 

我所试图做的是运行将在签名组提交一个查询,返回最小值和最大值的价格,相应的URL:

{ 
     "signature" : "AnotherAlphaNumericID", 
     "min_price" : 1504, 
     "min_rent_listing" : "http://www.thecompany.com/path/to/page1", 
     "max_price" : 1737, 
     "max_price_listing" : "http://www.thecompany.com/path/to/page2", 
} 

运行$group$signature领域获得$min$max是直线前进,但为了得到实际的URL我将查询到2与第一查询,返回排序使用$signature的文档列表,使用价格从小到大,然后(在python代码中)取第一个和最后一个元素。这工作正常,但会很高兴有一个查询。

想法?

p.s.

另外'玩具'与运行一个查询最小和一个最大和'压缩'的结果。

回答

2

你可以玩$group$project的帮助。假设数据集是

{ 
    "_id" : ObjectId("57db28dc705af235a826873a"), 
    "parent" : "AlphaNumericID", 
    "signature" : "AnotherAlphaNumericID", 
    "price" : 1638.0, 
    "url" : "http://www.thecompany.com/path/to/page1", 
    "date" : ISODate("2016-06-21T17:02:20.352+0000"), 
    "valid" : true 
} 
{ 
    "_id" : ObjectId("57db28dc705af235a826873b"), 
    "parent" : "AlphaNumericID", 
    "signature" : "AnotherAlphaNumericID", 
    "price" : 168.0, 
    "url" : "http://www.thecompany.com/path/to/page2", 
    "date" : ISODate("2016-06-21T17:02:20.352+0000"), 
    "valid" : true 
} 
{ 
    "_id" : ObjectId("57db28dc705af235a826873c"), 
    "parent" : "AlphaNumericID", 
    "signature" : "AnotherAlphaNumericID", 
    "price" : 163.0, 
    "url" : "http://www.thecompany.com/path/to/page3", 
    "date" : ISODate("2016-06-21T17:02:20.352+0000"), 
    "valid" : true 
} 
{ 
    "_id" : ObjectId("57db28dc705af235a826873d"), 
    "parent" : "AlphaNumericID", 
    "signature" : "AnotherAlphaNumericID", 
    "price" : 1680.0, 
    "url" : "http://www.thecompany.com/path/to/page4", 
    "date" : ISODate("2016-06-21T17:02:20.352+0000"), 
    "valid" : true 
} 

尝试下面的查询在外壳

db.collection.aggregate([ 
    {$sort:{price:1}}, 
    {$group:{ 
     _id:"$signature", 
     _first:{$first:"$url"}, 
     _last:{$last:"$url"}, 
     _min:{$first:"$price"}, 
     _max:{$last:"$price"}} 
    }, 
    {$project:{ 
    _id:0, 
    min:{ 
     url:"$_first", 
     price:"$_min"}, 
    max:{ 
     url:"$_last", 
     price:"$_max"}} 
    } 
]) 

输出将与最低/最高价和相应的URL

{ 
    "min" : { 
     "url" : "http://www.thecompany.com/path/to/page3", 
     "price" : 163.0 
    }, 
    "max" : { 
     "url" : "http://www.thecompany.com/path/to/page4", 
     "price" : 1680.0 
    } 
} 

我从原来的答复改变什么: _min:{$min:"$price"}, - - >使用$first _max:{$max:"$price"}} - >使用$last

原因:我们按照价格上涨排序进入管道。默认情况下,第一条记录为最小值,最后一条记录为最大值

+0

问题:有没有办法运行查询,以便返回最小值,最大值和最新值?在你的答案中,首先/最后=最小/最大值,因为我们按价格排序:1。我们可以采取结果,'充实'它与'最新',或者我必须坚持两个查询,其中第一个查询是上述和一个单独的查询按日期排序:-1并获得第一个结果? – goggelj

+0

那么,找到它的最好方法就是试试看。 – Saleem

+0

猜测不在一个查询中,因为我需要按最小/最大价格排序。对于最新的我必须按日期排序。种类不能是“连续的”,而是独立的... – goggelj