sql子查询到mongodb
Posted
技术标签:
【中文标题】sql子查询到mongodb【英文标题】:sql subqueries to mongodb 【发布时间】:2017-10-09 12:51:04 【问题描述】:我是 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 查询?
【问题讨论】:
我尝试使用 mongoDB group() 函数获取最高价格,然后使用它返回的列表尝试使用正常的 find() 函数。但它不起作用。我似乎在某个地方犯了一些错误。 不要忘记标记答案或您的(如果没有提供正确答案),因为否则这个问题将来将毫无用处。 【参考方案1】:如果您使用的是 MongoDB v. 3.2 或更新版本,您可以尝试使用$lookup
。
尝试使用聚合:
$sortDESC
您的收藏按价格;
将$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"
]);
【讨论】:
【参考方案2】:看起来您需要在有序文档的 $group
管道阶段中使用 $first
来执行此任务的聚合框架。对集合中的文档进行排序的初始管道步骤是 $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"
])
【讨论】:
谢谢......我试图先使用 aggregate() 来做,但没想到排序来完成工作。好主意!!再次感谢。以上是关于sql子查询到mongodb的主要内容,如果未能解决你的问题,请参考以下文章