Mongoose:检查对象是不是为猫鼬对象

Posted

技术标签:

【中文标题】Mongoose:检查对象是不是为猫鼬对象【英文标题】:Mongoose: check if object is mongoose objectMongoose:检查对象是否为猫鼬对象 【发布时间】:2012-06-05 07:50:59 【问题描述】:

谁知道检查对象是否是猫鼬对象的最简单方法是什么? 我是否最好检查是否定义了 toObject() 或者是否有更有效的方法。 非常感谢

【问题讨论】:

【参考方案1】:

您可以通过instanceof 运算符检查对象的原型,以确认它是您的猫鼬模型的实例。使用来自mongoosejs.com 的示例架构:

if (obj instanceof Cat) 
    // yes, it's a mongoose Cat model object
    ...

【讨论】:

不错!例如this.message = 对象实例消息?对象:新消息(对象);【参考方案2】:

我正在使用这个

if (object.constructor.name === 'model') 
  // object is mongoose object

【讨论】:

'model' 是一个非常通用的名称。 我的解决方案更严格一点object.constructor.collection.name !== 'SCHEMA_NAME'【参考方案3】:

我更喜欢确定一个对象是否是 Mongoose 模型的方法几乎和上面一样简单,但并不完全:

function isModel(obj) 
    obj = obj || 
    return obj.prototype instanceof mongoose.Model

在我使用它的上下文中,我不想得到未定义的返回,但确实需要验证我没有得到“3”或我期望模型的一些奇怪的值。

当然,在进一步思考之后,成为“猫鼬对象”的方式不止一种。我有时将 DTO 误认为是 Mongoose 模型,然后误用它,因此我在上面的测试......但如果我只需要验证某个东西是一个实例,但由于某种原因无法知道实例类型,我会做类似于 Lukasz 上面所做的事情并查看构造函数基础。

【讨论】:

访问 obj.prototype 在当前的 node.js 实现(不是 TypeScript)中不起作用。请改用此检查:Object.getPrototypeOf(object) instanceof mongoose.Model【参考方案4】:

另一种简单的方法:

const isMongooseModel = (object instanceof Mongoose.Model);

【讨论】:

-1 由于 object 用法不明确,现在是什么情况? Tony A.T. Mendina's answer 更合适,因为它使用prototype 来检查Mongoose.Model 的实例是否。【参考方案5】:

一种确定方法是你是否做了一个

if (data.toObject)

如果为真则返回一个 Function 语句,如果不是则返回 undefined;

【讨论】:

【参考方案6】:

在检查 ObjectID 是填充对象还是只是 ObjectID 的情况下,我的情况如下:

if (object._id.constructor.name === 'ObjectID') 
    // Not a populated object, only its ID
 

【讨论】:

【参考方案7】:

这个,如果你想确保它是你期望的模型。

dog.constructor.modelName === 'Dog'

【讨论】:

【参考方案8】:

要检查obj 是否是Mongoose 对象,请使用这个sn-p:

const _ = require('lodash');
const mongoose = require('mongoose');

function checkIfMongooseObject(obj) 
  return _.get(obj, 'constructor.base') instanceof mongoose.Mongoose;

与提供的其他解决方案相反,这个解决方案是安全的 - 无论obj 的类型(无论是字符串还是整数),它都不会失败。

【讨论】:

【参考方案9】:

试试这个:

var mongoose = require('mongoose');

function isMongoModel(yourObject)

    return yourObject.hasOwnProperty('schema') && yourObject.schema instanceof mongoose.Schema;

【讨论】:

【参考方案10】:

如果您正在使用 typescript 并使用 typescript 导入,那么这会有所帮助

import  Mongoose  from 'mongoose';

...
const isMongooseModel = (object instanceof Mongoose.prototype.Model); // true if object is of type Model
const isMongooseDocument = (object instanceof Mongoose.prototype.Document); // true if object is of type Document
const isMongooseQuery = (object instanceof Mongoose.prototype.Query); // true if object is of type Query

【讨论】:

以上是关于Mongoose:检查对象是不是为猫鼬对象的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JSON 模式转换为猫鼬模式

猫鼬一次查询所有子文档

如何获取 Model.countDocuments() 函数返回的文档计数并将其设置为猫鼬中的其他字段

如何将相同的模式引用为猫鼬中的类型[重复]

Mocha MongoDB Mongoose ObjectId ref 在第一个“it”语句后消失

无法将猫鼬虚拟与打字稿一起使用