我是否正确理解,如果我想查询集合,我必须执行以下操作:

    var mongoose = require("mongoose");

mongoose.connect();

var db = mongoose.connection;

db.on('open', function callback () {

    var kittySchema = mongoose.Schema({
        name: String
    })

    var Kitten = mongoose.model('Kitten', kittySchema)


    Kitten.find(function (err, kittens) {
        console.log(kittens);
    })

});

我是否每次都必须指定模式,即使已经有一群小cat ?

为什么我不能做db.Kittens.find()个?

推荐答案

从mongoose 主页:

Mongoose提供了一个直接的、基于模式的解决方案

Mongoose无法从可能唯一的文档集合中推断模式.MongoDB不会对存储在集合中的文档实施模式.

因此,Mongoose在NodeJS原生驱动程序(here)上添加了一层,许多人认为这一层更有效率.但在使用Node时,MongoDB不需要使用它.JS.

mongoose 基本上需要两件事才能工作:

  1. Schema==这定义了文档 struct (reference).您可以向其他集合(模型)添加validation、新方法、添加虚拟属性、使用data types、建立references.
  2. Model==这个类在运行时用来表示对集合的查询(reference).模式定义用于构建模型.

因此,正如您在粘贴的示例中看到的,定义了一只小cat Schema,然后创建了一只Model Kitten.使用模式和模型的好处在于,Mongoose随后会强制执行可用的属性/字段.

在一个应用程序中只定义一次SchemaModel.因此,通常在应用程序启动时,您需要执行代码来定义它们,然后在整个应用程序生命周期中根据需要使用Model个实例.

你可能会有更多的理由想使用mongoose .

不过,您完全正确,您可以通过使用NodeJS本机驱动程序来使用更直接的东西,而不需要模式.语法与您展示的类似,但有点复杂:

MongoClient.connect("mongodb://localhost:27017/exampleDb", function(err, db) {
  if(err) { return console.dir(err); }

  var collection = db.collection('kittens');

    collection.find().toArray(function(err, kittens) {
        // here ...
    });    
});

而不是简单的:

Kitten.find(function(err, kittens) {

});

此外,使用Mongoose时,您可能会发现编写更复杂的查询更容易编写和读取:

Kitten.find().where('name', 'Harold').exec(/*callback*/);

我建议阅读更多文档,更好地了解框架,以及它是否符合您的需求.不幸的是,文档有点分散,但是如果你浏览Guide个标题的子标题,你会有很多有用的信息.

Mongodb相关问答推荐

Mongodb如果数组中有外部键,则将排序应用到查找结果

在MongoDB查询中添加来自另一个集合的匹配文档的计数

如何用Python和MongoDB找到单据字段的最大值?

无法配置数据源:未指定url属性,无法为 MongoDb 配置嵌入数据源

更快地识别嵌套对象数组中具有重复字段的文档

如何使用 Golang 库获取 MongoDB 版本?

MongoDB:设置 Windows 服务

Node.js 和 MongoDB,重用 DB 对象

从命令行创建 MongoDB 用户

如何使用 -number 后缀对字符串进行 MongoDB 查询排序?

具有多个字段的mongodb文本搜索

为什么 PyMongo 会抛出 AutoReconnect?

如何在array.NET驱动程序中的元素属性上创建MongoDB MultiKey索引

如何使用node.js http服务器从mongodb返回大量行?

MongoDB - 聚合 - 获取数组中的唯一项

使用 mongodb 在数组中查找子文档

查询不等于 null 或空的地方

更新时提示Field name duplication not allowed with modifiers

MongoDB 和 Robomongo: Can't connect (authentication)

我可以使用字符串作为 mongodb 文档的 ID 类型吗?