查询集合而不在猫鼬中传递模式
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 然后强制执行可用的属性/字段。
您只需在应用程序中定义一次Schema
s 和Model
s。因此,通常在应用程序启动时,您需要执行代码来定义它们,然后在整个应用程序生命周期中根据需要使用 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 之类的东西。
【讨论】:
谢谢你。我想我的问题是我发现猫鼬的文档非常混乱。您介意简要解释一下模式和模型的术语以及它们如何协同工作吗?以上是关于查询集合而不在猫鼬中传递模式的主要内容,如果未能解决你的问题,请参考以下文章