MongoDB和Mongoose之间的区别

时间:2015-02-25 06:01:02

标签: node.js mongodb mongoose

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

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

9 个答案:

答案 0 :(得分:160)

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

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

Mongoose构建于MongoDB驱动程序之上,为程序员提供了一种模拟数据的方法。

修改 我不想评论哪个更好,因为这会使这个答案自以为是。但是,我将列出使用这两种方法的一些优点和缺点。

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

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

答案 1 :(得分:35)

Mongo是NoSQL数据库。

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

Mongoose是为我们提供使用易于理解的查询访问mongo数据的功能的orm之一。

Mongoose扮演着对数据库模型的抽象角色。

答案 2 :(得分:10)

我发现两者之间的另一个区别是connect to multiple databasesmongodb native driver相当容易,而你必须在mongoose中使用仍有一些缺点的解决办法。

因此,如果您想使用多租户应用程序,请转到mongodb本机驱动程序。

答案 3 :(得分:3)

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

猫鼬:对象数据建模(ODM)库,可为您的数据提供严格的建模环境。用于与MongoDB进行交互,它通过提供管理数据的便利性使生活变得更轻松。

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

答案 4 :(得分:3)

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

Mongodb:

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

猫鼬:

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

答案 5 :(得分:2)

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

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:0)

Mongoose是在mongodb驱动程序的顶部构建的,mongodb驱动程序的级别较低。猫鼬提供了这种简单的抽象,可以轻松地定义模式和查询。但是从性能方面来说,Mongdb Driver是最好的。

答案 8 :(得分:0)

从第一个答案开始,

“使用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" }
  ]
});`