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

use*_*960 19 mongoose mongodb

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

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

});
Run Code Online (Sandbox Code Playgroud)

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

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

Wir*_*rie 31

来自Mongoose主页:

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

Mongoose无法从一组潜在的独特文档中推断出一个模式.MongoDB不会对存储在集合中的文档强制执行架构.

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

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

  1. Schema ==这定义了文档结构(引用).您可以添加验证,新方法,添加虚拟属性,使用数据类型,建立对其他集合(模型)的引用.
  2. Model ==这是在运行时用于表示对集合的查询(引用)的类.模式定义用于构建模型.

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

您只在应用程序中定义一次Schemas和Models.因此,通常在应用程序启动时,您需要执行代码来定义它们,然后在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 ...
    });    
});
Run Code Online (Sandbox Code Playgroud)

而不是简单:

Kitten.find(function(err, kittens) {

});
Run Code Online (Sandbox Code Playgroud)

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

Kitten.find().where('name', 'Harold').exec(/*callback*/);
Run Code Online (Sandbox Code Playgroud)

我建议阅读更多文档,以更好地了解框架,以及它是否适合您的需求.遗憾的是,文档有点分散,但如果您浏览标题的子标题Guide,您将获得大量有用的信息.


小智 12

您不能在没有架构的情况下使用Mongoose.如果你想使用没有模式的MongoDB,不要使用Mongoose,而是使用像mongodb这样的东西.

  • 到目前为止,谢谢你。我想我的问题是我发现猫鼬的文档非常混乱。您介意简要解释模式和模型的术语以及它们如何协同工作吗? (2认同)
  • 是的,他们的文档真的可以使用一些帮助 (2认同)

Rit*_*wik 9

尝试这个..

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

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

module.exports = { Product };
Run Code Online (Sandbox Code Playgroud)

  • 这个答案违反了问题的“不传递模式”部分。但它确实有效。它帮助我访问与更新的架构相关的旧数据,只是将它们更新为新格式。谢谢。 (3认同)