我是否理解正确,如果我想查询集合,我必须执行以下操作:
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()
之类的事情?
答案 0 :(得分:30)
来自Mongoose主页:
Mongoose提供了一个直接的,基于模式的解决方案 建模您的应用程序数据,包括内置类型转换, 验证,查询构建,业务逻辑钩子等等 框。
Mongoose无法从可能独特的文档集合中推断出架构。 MongoDB不会对存储在集合中的文档强制执行架构。
因此,Mongoose在NodeJS本机驱动程序(here)上添加了一个层,许多人发现它更有效率。使用Node.JS时,不要求使用MongoDB。
Mongoose需要从根本上解决两件事:
因此,正如您在粘贴的示例中看到的那样,定义了一只小猫Schema
,然后创建了Model
Kitten
。使用模式和模型的好处是Mongoose然后强制执行可用的属性/字段。
您只需在应用中定义Schema
和Model
一次。因此,通常在应用程序启动时,您需要执行代码来定义它们,然后在整个应用程序生命周期中根据需要使用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 };