【问题标题】:Difference between MongoDB and MongooseMongoDB 和 Mongoose 的区别
【发布时间】:2015-04-27 01:07:53
【问题描述】:

我想使用 mongodb 数据库,但我注意到有两个不同的数据库,它们有自己的网站和安装方法:mongodb 和 mongoose。所以我开始问自己这个问题:“我用哪一个?”。

所以为了回答这个问题,我问社区你是否可以解释这两者之间的区别是什么?如果可能的话利弊?因为他们真的和我很相似。

【问题讨论】:

标签: node.js mongodb mongoose


【解决方案1】:

Mongodb 和 Mongoose 是两个完全不同的东西!

Mongodb 是数据库本身,而 Mongoose 是 Mongodb 的对象建模工具

编辑:正如指出的 MongoDB 是 npm 包,谢谢!

【讨论】:

  • mongodb 不是数据库,它是一个节点包,它是本机 mongo 驱动程序。它是从节点 js 访问 mongo 服务器的最低级别 API。
  • 问题是关于数据库操作与猫鼬的 Mongodb 本机驱动程序。答案不是重点。
  • @mariocatch MongoDB 是一个文档数据库,具有您所需的查询和索引所需的可扩展性和灵活性。它写在其文档的主页上。
【解决方案2】:

我假设您已经知道 MongoDB 是一个 NoSQL 数据库系统,它以 BSON 文档的形式存储数据。但是,您的问题是关于 Node.js 的包。

就 Node.js 而言,mongodb 是用于与 mongodb 实例交互的本机驱动程序mongoose 是用于 MongoDB 的对象建模工具

mongoose 建立在mongodb 驱动程序之上,为程序员提供了一种对其数据建模的方法。

编辑: 我不想评论哪个更好,因为这会使这个答案固执己见。但是,我将列出使用这两种方法的一些优点和缺点。

使用mongoose,用户可以为特定集合中的文档定义架构。它为MongoDB中数据的创建和管理提供了很多便利。不利的一面是,学习 mongoose 可能需要一些时间,并且在处理非常复杂的模式方面存在一些限制。

但是,如果您的集合架构不可预测,或者您希望在 Node.js 中获得类似 Mongo-shell 的体验,那么请继续使用 mongodb 驱动程序。这是最简单的拾取。这里的缺点是您必须编写大量代码来验证数据,并且出错的风险更高。

【讨论】:

  • 这是一个相当基于意见的问题。有些人可能更喜欢较低级别的 API。您为什么不检查一下Mongoose 和原生驱动程序,然后决定哪个更适合您?
  • @Michael9 Node.js 的本机 MongoDB 驱动程序具有相同的名称。请注意“就 Node.js 而言……”这句话。您的编辑不正确。
  • @ZeMoon 在这种情况下应该是 mongodb 而不是 MongoDB:P
  • 在 mongoose 以复数形式链接到集合名称是否存在实际差异?
  • 还应该考虑性能因素,请参考这个网址,这家伙分享了很棒的基准测试。medium.com/@bugwheels94/…
【解决方案3】:

Mongo 是 NoSQL 数据库。

如果您不想为您的数据模型使用任何ORM,那么您也可以使用本机驱动程序 mongo.js:https://github.com/mongodb/node-mongodb-native

Mongoose 是 orm 之一,它为我们提供了通过易于理解的查询访问 mongo 数据的功能。

Mongoose 在您的数据库模型中充当抽象角色。

【讨论】:

  • @ArslanRamay: medium.com/@bugwheels94/…,很有帮助
  • 这最初是为旧的 Mongoose 版本运行的,也不是作为 .lean() 运行的,而是作为整个对象返回的,不是很全面
  • Mongoose 是 ODM(对象文档映射器)而不是 ORM(对象关系映射器)。
【解决方案4】:

我发现两者的另一个区别是connect to multiple databasesmongodb native driver 相当容易,而您必须在mongoose 中使用变通方法,但仍然有一些缺点。

因此,如果您想使用多租户应用程序,请使用 mongodb 原生驱动程序。

【讨论】:

【解决方案5】:

Mongodb 和 Mongoose 是与 MongoDB 数据库交互的两个不同驱动程序。

Mongoose:对象数据建模 (ODM) 库,可为您的数据提供严格的建模环境。用于与 MongoDB 交互,通过提供方便的数据管理使生活更轻松。

Mongodb:Node.js 中用于与 MongoDB 交互的本机驱动程序。

【讨论】:

    【解决方案6】:

    如果您打算将这些组件与您的专有代码一起使用,请参阅以下信息。

    MongoDB:

    1. 这是一个数据库。
    2. 此组件受 Affero 通用公共许可证 (AGPL) 许可证的约束。
    3. 如果您将此组件与您的专有代码一起链接,那么您必须在公共领域发布您的整个源代码,因为它具有病毒效应,例如(GPL、LGPL 等)
    4. 如果您将应用程序托管在云上,则 (2) 将适用,您还必须向最终用户发布您的安装信息。

    猫鼬:

    1. 这是一个对象建模工具。
    2. 此组件受 MIT 许可证管理。
    3. 允许将此组件与专有代码一起使用,没有任何限制。
    4. 允许使用任何媒体或主机传送您的应用程序。

    【讨论】:

    • 只是想我会提到。 2018 年 10 月 16 日之前的服务器组件是 AGPL,但现在是一些自定义许可证。尽管驱动程序(mongodb)始终是 Apache 并且与专有代码无关。参考:mongodb.com/community/licensing
    • MongoDB 第 4 部分的答案不正确。通常客户端应用程序使用 Apache v2 许可的 MongoDB 驱动程序(即 MongoDB Node.JS 驱动程序)。如果您正在修改 MongoDB 服务器代码本身(数据库)并重新分发它,那么您要么需要商业协议,要么将其开源。 SSPL 许可证更改只是对数据库即服务云供应商条款的补充,即公开类似于 MongoDB Atlas 或 AWS RDS 等的数据库功能。
    • 这不是真的。 MongoDB数据库本身与mongo驱动不同。
    • 答案传播 FUD。它被错误地指责 AGPL 和 LGPL 具有病毒性质,并声称使用 mongodb 驱动程序的应用程序必须在 GPL 许可下发布。 Mongoose 使用 mongodb 驱动程序并使用 MIT。所以答案的第一部分是谎言。
    【解决方案7】:

    mongo-db 对于新开发者来说可能不是一个很好的选择。
    另一方面,mongoose 作为 ORM(对象关系映射)对于新手来说可能是更好的选择。

    【讨论】:

    • 欢迎来到 Stack Overflow!您的回答可能很有价值,但缺少一些解释。也许您仍然可以在答案中添加一些词。 Here is a guide to give good answers.
    • 不是真的;许多人会发现只使用本机驱动程序方法来访问和操作他们想要的数据比担心模式和所有其他猫鼬的东西要容易得多。
    【解决方案8】:

    Mongoose 是建立在 mongodb 驱动之上的,mongodb 驱动更底层。 Mongoose 提供了简单的抽象来轻松定义模式和查询。但在性能方面,Mongdb Driver 是最好的。

    【讨论】:

      【解决方案9】:

      从第一个答案开始,

      “使用 Mongoose,用户可以为特定集合中的文档定义架构。它为 MongoDB 中数据的创建和管理提供了很多便利。”

      您现在还可以使用 mongoDB 本机驱动程序定义架构

      ##新收藏

      db.createCollection("recipes",
          validator: { $jsonSchema: {
               <<Validation Rules>>
              }
          }
      )
      

      ##对于现有的集合

      db.runCommand({
          collMod: "recipes",
          validator: { $jsonSchema: {
               <<Validation Rules>>
              }
          }
      })
          
      

      ##完整示例

      db.createCollection("recipes", {
        validator: {
          $jsonSchema: {
            bsonType: "object",
            required: ["name", "servings", "ingredients"],
            additionalProperties: false,
            properties: {
              _id: {},
              name: {
                bsonType: "string",
                description: "'name' is required and is a string"
              },
              servings: {
                bsonType: ["int", "double"],
                minimum: 0,
                description:
                  "'servings' is required and must be an integer with a minimum of zero."
              },
              cooking_method: {
                enum: [
                  "broil",
                  "grill",
                  "roast",
                  "bake",
                  "saute",
                  "pan-fry",
                  "deep-fry",
                  "poach",
                  "simmer",
                  "boil",
                  "steam",
                  "braise",
                  "stew"
                ],
                description:
                  "'cooking_method' is optional but, if used, must be one of the listed options."
              },
              ingredients: {
                bsonType: ["array"],
                minItems: 1,
                maxItems: 50,
                items: {
                  bsonType: ["object"],
                  required: ["quantity", "measure", "ingredient"],
                  additionalProperties: false,
                  description: "'ingredients' must contain the stated fields.",
                  properties: {
                    quantity: {
                      bsonType: ["int", "double", "decimal"],
                      description:
                        "'quantity' is required and is of double or decimal type"
                    },
                    measure: {
                      enum: ["tsp", "Tbsp", "cup", "ounce", "pound", "each"],
                      description:
                        "'measure' is required and can only be one of the given enum values"
                    },
                    ingredient: {
                      bsonType: "string",
                      description: "'ingredient' is required and is a string"
                    },
                    format: {
                      bsonType: "string",
                      description:
                        "'format' is an optional field of type string, e.g. chopped or diced"
                    }
                  }
                }
              }
            }
          }
        }
      });
      

      插入集合示例

      db.recipes.insertOne({
        name: "Chocolate Sponge Cake Filling",
        servings: 4,
        ingredients: [
          {
            quantity: 7,
            measure: "ounce",
            ingredient: "bittersweet chocolate",
            format: "chopped"
          },
          { quantity: 2, measure: "cup", ingredient: "heavy cream" }
        ]
      });
      

      【讨论】:

        【解决方案10】:

        MongoDB 是官方的 MongoDB Node.js 驱动程序,允许 Node.js 应用程序连接到 MongoDB 并处理数据。 另一方面,Mongoose 是在 mongoDB 之上构建的其他库。它更容易理解和使用。如果您是初学者,那么与猫鼬一起工作会更好。

        【讨论】:

          猜你喜欢
          • 2015-11-19
          • 2019-12-16
          • 1970-01-01
          • 2021-10-13
          • 2015-10-23
          • 1970-01-01
          • 2012-12-24
          • 2023-03-09
          • 2018-11-09
          相关资源
          最近更新 更多