查询集合而不在mongoose中传递模式

时间:2014-01-29 11:24:09

标签: mongodb mongoose

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

    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);
    })

});

我是否必须每次都指定架构,即使已经有一组小猫?

为什么我不能做db.Kittens.find()之类的事情?

3 个答案:

答案 0 :(得分:30)

来自Mongoose主页:

  

Mongoose提供了一个直接的,基于模式的解决方案   建模您的应用程序数据,包括内置类型转换,   验证,查询构建,业务逻辑钩子等等   框。

Mongoose无法从可能独特的文档集合中推断出架构。 MongoDB不会对存储在集合中的文档强制执行架构。

因此,Mongoose在NodeJS本机驱动程序(here)上添加了一个层,许多人发现它更有效率。使用Node.JS时,不要求使用MongoDB。

Mongoose需要从根本上解决两件事:

  1. 架构==这定义了文档结构(reference)。您可以添加validation,新方法,添加虚拟属性,使用data types,将references建立到其他集合(模型)。
  2. Model ==这是在运行时用于表示对集合(reference)的查询的类。模式定义用于构建模型。
  3. 因此,正如您在粘贴的示例中看到的那样,定义了一只小猫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标题的子标题,您将获得大量有用的信息。

答案 1 :(得分:12)

如果没有架构,则无法使用Mongoose。如果你想使用没有模式的MongoDB,不要使用Mongoose,而是使用类似mongodb的东西。

答案 2 :(得分:3)

尝试一下。

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const ProductSchema = new Schema({}, { strict: false });
const Product = mongoose.model('Product', ProductSchema, 'products');

module.exports = { Product };