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

所以为了回答这个问题,我问社区是否可以解释这两者之间的区别?如果可能的话,有利有弊?因为在我看来他们真的很像。


当前回答

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

其他回答

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

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

编辑:如上所述,MongoDB是npm包,谢谢!

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

在Node.js方面,mongodb是与mongodb实例交互的原生驱动程序,mongoose是mongodb的对象建模工具。

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

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

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

然而,如果你的集合模式是不可预测的,或者你想在Node.js中获得类似于mongodb shell的体验,那么就使用mongodb驱动程序吧。这是最容易上手的。这样做的缺点是必须编写大量的代码来验证数据,出错的风险也更高。

Mongoose是在mongodb驱动的基础上构建的,mongodb驱动的层次比较低。Mongoose提供了简单的抽象来轻松定义模式和查询。但是在性能方面,Mongdb Driver是最好的。

Mongo是NoSQL数据库。

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

Mongoose是orm中的一种,它为我们提供了简单易懂的查询来访问mongo数据的功能。

Mongoose在数据库模型上扮演抽象的角色。

从第一个答案来看,

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