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

Posted

技术标签:

【中文标题】查询集合而不在猫鼬中传递模式【英文标题】: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() 将是同步的 【参考方案1】:

来自猫鼬主页:

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

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

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

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

    Schema == 这定义了文档结构 (reference)。您可以添加validation,新方法,添加虚拟属性,使用data types,建立references到其他集合(模型)。 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 之类的东西。

【讨论】:

谢谢你。我想我的问题是我发现猫鼬的文档非常混乱。您介意简要解释一下模式和模型的术语以及它们如何协同工作吗?

以上是关于查询集合而不在猫鼬中传递模式的主要内容,如果未能解决你的问题,请参考以下文章

在猫鼬中,如何根据相关集合中的值查找记录?

如何在猫鼬中查询多个集合

如何使用嵌入模式的express在猫鼬中传递多个复杂查询以将其呈现为我的ejs文件

关于如何在猫鼬中编写评论模式的任何想法?

关于如何在猫鼬中编写评论模式的任何想法?

猫鼬中 ref 集合的默认值