MongoDB聚合查询与MySQL SELECT字段1 FROM表

约翰

我对MongoDB完全陌生,想比较NoSQL数据模型相对于其关系数据库计数器部分的查询性能。我把它写进了MongoDB shell

// Make 10 businesses
// Each business has 10 locations
// Each location has 10 departments
// Each department has 10 teams
// Each team has 100 employees
(new Array(10)).fill(0).forEach(_=>
    db.businesses.insert({
        "name":"Business Name",
        "locations":(new Array(10)).fill(0).map(_=>({
            "name":"Office Location",
            "departments":(new Array(10)).fill(0).map(_=>({
                "name":"Department",
                "teams":(new Array(10)).fill(0).map(_=>({
                    "name":"Team Name",
                    "employees":(new Array(100)).fill(0).map(_=>({
                        "age":Math.floor(Math.random()*100)
                    }))
                }))
            }))
        }))
    })
);

然后,我EXPLAIN SELECT age,name,(and a few other fields) FROM employees WHERE age >= 50 ORDER BY age DESC通过编写以下语句尝试了MySQL的等效功能

db.businesses.aggregate([
    { $unwind: "$locations" },
    { $unwind: "$locations.departments" },
    { $unwind: "$locations.departments.teams" },
    { $unwind: "$locations.departments.teams.employees" },
    { $project: { _id: 0, age: "$locations.departments.teams.employees.age" } },
    { $match: { "age": { $gte: 50 }} },
    { $sort: {"age" : -1}}
]).explain("executionStats")

结果是:

“,” errmsg“:”排序超出了内存限制,为104857600字节,但未选择加入外部排序。中止操作。传递allowDiskUse:true来选择加入。“,

所以我删除了sort子句并尝试获取一个explain但是结果是:

TypeError:db.businesses.aggregate(...)。explain不是函数

所以我的问题是:

  1. 首先,我想知道SELECT age FROM employees WHERE age >= 50 ORDER BY age DESC与MongoDB的聚合查询计数器部分相比的性能差异差不多一样吗?一个会比另一个更快或更有效吗?

  2. 另外,如何修复MongoDB查询,以便获得性能详细信息以与MySQL查询计数器部分进行比较?

巴斯·莫斯基蒂

员工是单一实体;因此,您可能不想age在部门,位置和团队的丰富结构中对团队成员进行如此深入的建模拥有一个单独的employees集合,只需执行以下操作就可以了:

db.businesses.aggregate([
{$match: {"age": {$gt: 50} }}
,{$sort: {"age": -1} }
]);

在您的businesses收藏中,您可以拥有:

{ teams: [ {name: "T1", employees: [ "E1", "E34" ]} ] }

或者,尝试以下操作:

db.businesses.aggregate([ your pipeline] ,{allowDiskUse:true});

OP的设置为10个业务-> 10个位置-> 10个部门-> 10个团队-> 100个雇员。前三个展开会产生10000倍的数据爆炸,但最后一个则超出100倍。我们可以使用$filter以下方法减少点击量

db.businesses.aggregate([
{ $unwind: "$locations" },
{ $unwind: "$locations.departments" },
{ $unwind: "$locations.departments.teams" },

{$project: {
        XX: {$filter: {
                    input: "$locations.departments.teams.employees",
                    as: "z",
                    cond: {$gte: [ "$$z.age", 50] }
            }}
    }}
,{$unwind: "$XX"}
,{$sort: {"XX.age":-1}}])

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MongoDB 聚合查询 - 组聚合字段错误

来自分类Dev

聚合查询上的Mongodb填充字段

来自分类Dev

mongodb聚合查询字段值长度的总和

来自分类Dev

INSERT INTO MySQL表SELECT FROM PostgreSQL表

来自分类Dev

根据连接表的字段过滤 MySQL Select

来自分类Dev

MongoDB:尽管仅使用索引字段,但不涵盖聚合查询

来自分类Dev

在MongoDB聚合查询中使用以$开头的字段

来自分类Dev

MongoDB:将字段从聚合输出添加到查询

来自分类Dev

MongoDB:尽管仅使用索引字段,但不涵盖聚合查询

来自分类Dev

为MongoDB聚合查询中的每个文档提取大量字段

来自分类Dev

Java mysql查询(“ SELECT * FROM电影”仅返回1行

来自分类Dev

如何在MYSQL查询中使用聚合函数联接表?

来自分类Dev

来自不同mysql表的查询字段

来自分类Dev

MySQL:特定查询,以基于0或1的字段从2个不同的表中获取信息

来自分类Dev

MYSQL中的查询表。mysql select语句中的IF语句,如果字段为空,则左连接以获取替换值

来自分类Dev

用SELECT查询中其他表中的字段替换字段

来自分类Dev

PHP / MySQL SELECT按字段(值1,值2)查询和排序等

来自分类Dev

MySql-从表2获取字段,如果不是,则从表1获取字段

来自分类Dev

基于多个查询字段的MongoDB聚合计数-(多个字段计数)

来自分类Dev

MySQL SELECT列FROM表WHERE列为NULL

来自分类Dev

MySQL (python 3.6) - SELECT * FROM table - 返回行数而不是表

来自分类Dev

具有多个表的联结表上的MySQL SELECT查询

来自分类Dev

MongoDB聚合查询帮助-与多个字段分组并转换为数组

来自分类Dev

MongoDB聚合查询-重命名嵌入式文档中返回的字段

来自分类Dev

具有$ lookup的MongoDB聚合仅包含(或项目)一些要从查询中返回的字段

来自分类Dev

使用关联集合字段进行查找和排序的MongoDB聚合正在减慢查询速度

来自分类Dev

MongoDB聚合:在$ match $或查询中使用当前文档的字段值

来自分类Dev

基于具有相似值的多个字段的MongoDB聚合查询

来自分类Dev

Mongodb聚合查询以基于数组中对象内部的字段求和所有值

Related 相关文章

  1. 1

    MongoDB 聚合查询 - 组聚合字段错误

  2. 2

    聚合查询上的Mongodb填充字段

  3. 3

    mongodb聚合查询字段值长度的总和

  4. 4

    INSERT INTO MySQL表SELECT FROM PostgreSQL表

  5. 5

    根据连接表的字段过滤 MySQL Select

  6. 6

    MongoDB:尽管仅使用索引字段,但不涵盖聚合查询

  7. 7

    在MongoDB聚合查询中使用以$开头的字段

  8. 8

    MongoDB:将字段从聚合输出添加到查询

  9. 9

    MongoDB:尽管仅使用索引字段,但不涵盖聚合查询

  10. 10

    为MongoDB聚合查询中的每个文档提取大量字段

  11. 11

    Java mysql查询(“ SELECT * FROM电影”仅返回1行

  12. 12

    如何在MYSQL查询中使用聚合函数联接表?

  13. 13

    来自不同mysql表的查询字段

  14. 14

    MySQL:特定查询,以基于0或1的字段从2个不同的表中获取信息

  15. 15

    MYSQL中的查询表。mysql select语句中的IF语句,如果字段为空,则左连接以获取替换值

  16. 16

    用SELECT查询中其他表中的字段替换字段

  17. 17

    PHP / MySQL SELECT按字段(值1,值2)查询和排序等

  18. 18

    MySql-从表2获取字段,如果不是,则从表1获取字段

  19. 19

    基于多个查询字段的MongoDB聚合计数-(多个字段计数)

  20. 20

    MySQL SELECT列FROM表WHERE列为NULL

  21. 21

    MySQL (python 3.6) - SELECT * FROM table - 返回行数而不是表

  22. 22

    具有多个表的联结表上的MySQL SELECT查询

  23. 23

    MongoDB聚合查询帮助-与多个字段分组并转换为数组

  24. 24

    MongoDB聚合查询-重命名嵌入式文档中返回的字段

  25. 25

    具有$ lookup的MongoDB聚合仅包含(或项目)一些要从查询中返回的字段

  26. 26

    使用关联集合字段进行查找和排序的MongoDB聚合正在减慢查询速度

  27. 27

    MongoDB聚合:在$ match $或查询中使用当前文档的字段值

  28. 28

    基于具有相似值的多个字段的MongoDB聚合查询

  29. 29

    Mongodb聚合查询以基于数组中对象内部的字段求和所有值

热门标签

归档