2017-10-09 116 views
0

我是新來的MongoDB,我試圖把SQL查詢轉換成MongoDB查詢。但似乎無法找到任何方法來將一個SQL查詢與子查詢轉換爲mongoDB。 例如:sql子查詢到MongoDB

SELECT article, dealer, price FROM shop WHERE price=(SELECT MAX(price) FROM shop);

我嘗試以下,但它似乎並沒有工作。

db.shop.group({ 
"initial": {}, 
"reduce": function(obj, prev) { 
    prev.maximumvalueprice = isNaN(prev.maximumvalueprice) ? obj.price : 
    Math.max(prev.maximumvalueprice, obj.price); 
}}).forEach(
function(data){ 
    db.shop.find({ 
     "price": data 
     }, 
     { 
      "article": 1, 
      "dealer": 1, 
      "price": 1 
     }) 
}) 

如何將此SQL查詢轉換爲MongoDB查詢?

+0

我試圖獲取最大的價格與MongoDB的組()函數,然後使用它返回的列表嘗試使用普通的find()函數。但它不起作用。我似乎在某個地方犯了一些錯誤。 –

+1

不要忘記標記一個答案或你的(如果沒有提供正確的答案),因爲在其他方面,這個問題將來是沒有用的。 – Neodan

回答

0

如果您使用的是MongoDB v.3.2或更新版本,您可以嘗試使用$lookup

嘗試使用聚合:

  • $sort您的收藏按價格由DESC;
  • $limit設置爲1(這將需要第一個文件,這將是最大的價格);
  • 然後使用$lookup以最大價格從相同集合中選擇文檔並將其設置爲tmpCollection元素;
  • $unwindtmpCollection;
  • $replaceRoot - 更改文檔根$tmpCollection

例子:

db.getCollection("shop").aggregate([ 
    {$sort: {"price":-1}}, 
    {$limit: 1}, 
    {$lookup: { 
     from: "shop", 
     localField: "price", 
     foreignField: "price", 
     as: "tmpCollection" 
    }}, 
    {$unwind: "$tmpCollection"}, 
    {$replaceRoot: {newRoot:"$tmpCollection"}} 
]); 
0

看起來像你需要使用$first訂購的文檔$group流水線階段內這個任務的聚合框架。集合中排序的文件的初始管道步驟是$sort

db.shop.aggregate([ 
    { "$sort": { "price": -1 } }, // <-- sort the documents first in descending order 
    { 
     "$group": { 
      "_id": null, 
      "article": { "$first": "$article" }, 
      "dealer": { "$first": "$dealer" }, 
      "price": { "$first": "$price" } 
     } 
    } 
]) 

或使用$last

db.shop.aggregate([ 
    { "$sort": { "price": 1 } }, // <-- note the sort direction 
    { 
     "$group": { 
      "_id": null, 
      "article": { "$last": "$article" }, 
      "dealer": { "$last": "$dealer" }, 
      "price": { "$last": "$price" } 
     } 
    } 
]) 
+0

謝謝......我正在嘗試使用aggregate(),但沒有想到爲了完成工作而進行排序。好主意!!再次感謝。 –