【问题标题】:sql subqueries to mongodbsql子查询到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() 函数。但它不起作用。我似乎在某个地方犯了一些错误。
  • 不要忘记标记答案或您的(如果没有提供正确答案),因为否则这个问题将来将毫无用处。

标签: mysql sql mongodb


【解决方案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() 来做,但没想到排序来完成工作。好主意!!再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多