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的主要内容,如果未能解决你的问题,请参考以下文章

mongodb 查询子节点

mongoDB中的子查询问题

Mysql查询详解(条件查询、子查询、模糊查询、连接查询。。。)

子数组中的 MongoDB 更新查询

mongodb子文档查询

MongoDB 查询子文档数组