【问题标题】:querying a collection without passing schema in mongoose查询集合而不在猫鼬中传递模式
【发布时间】:2014-02-21 04:05:21
【问题描述】:

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

    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() 的事情?

【问题讨论】:

  • db.Kittens.find() 将是同步的

标签: mongodb mongoose


【解决方案1】:

来自猫鼬主页:

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

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

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

Mongoose 从根本上需要两件事才能工作:

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

因此,正如您在粘贴的示例中看到的那样,定义了一只小猫 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 ...
    });    
});

而不是简单的:

Kitten.find(function(err, kittens) {

});

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

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

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

【讨论】:

    【解决方案2】:

    试试这个..

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

    【讨论】:

    • 这个答案违反了问题的“不传递模式”部分。但它确实有效。它帮助我访问与更新的 Schema 相关的旧数据,只是为了将它们更新为新格式。谢谢。
    【解决方案3】:

    你不能在没有模式的情况下使用 Mongoose。如果你想在没有模式的情况下使用 MongoDB,请不要使用 Mongoose,而是使用 mongodb 之类的东西。

    【讨论】:

    • 谢谢你。我想我的问题是我发现猫鼬的文档非常混乱。您介意简要解释一下模式和模型的术语以及它们如何协同工作吗?
    猜你喜欢
    • 2018-02-05
    • 1970-01-01
    • 2017-12-03
    • 2017-04-18
    • 2016-01-27
    • 1970-01-01
    • 2018-06-11
    • 2020-06-02
    • 2016-07-15
    相关资源
    最近更新 更多