2016-09-15 173 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