标签: mongoose-schema

通过 Model.save() 更新时触发 Mongoose 预保存挂钩

我通过 pre hook 为 mongodb 文档保存一个较小的唯一 id。

schema.pre('save', function(next) {
    this.refId = uid();
    next();
});
Run Code Online (Sandbox Code Playgroud)

据我了解,save挂钩仅在创建文档时运行。

但是,当我通过查询获取文档并尝试通过添加一些新数据来保存它时,唯一的 id ( refId) 字段也会更新。

const foo = Foo.findOne({refId: 'fwe23fw23'});

Foo.field = 'new value';
Foo.save(); // runs pre hook again;
Run Code Online (Sandbox Code Playgroud)

这让我相信save钩子在每个save()查询上运行,无论它是否是createorupdate方法。

如何确保refId只创建一次并且在任何更新操作中都不会更改?

注意:我知道我可以使用updateOne()模型本身来更新文档。但我想了解为什么保存文档本身不起作用。

mongoose mongodb mongoose-schema

2
推荐指数
1
解决办法
2869
查看次数

如何在mongodb聚合查询中获取虚拟字段?

我有一个带有一个虚拟字段的模型show

modelSchema.virtual('show').get(function () {
    return true
})
Run Code Online (Sandbox Code Playgroud)

现在,当我在 NodeJS 中使用查询时,find如下所示:

model.find({"$license_id": license_id})
Run Code Online (Sandbox Code Playgroud)

结果,我有了虚拟场show

如果我使用aggregation 这样的查询:

model.aggregate([
    {
        $match: {
            $expr: { $eq: ["$license_id", license_id] }
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

结果我没有虚拟场show

如何获取aggregation查询中的虚拟字段?您有解决这个问题的想法吗?

mongoose mongodb node.js mongodb-query mongoose-schema

2
推荐指数
1
解决办法
2412
查看次数

如何使用Mongoose删除索引

猫鼬

Imagdata.dropIndexes( { "image_id": 1 }, function(err){
         if(err){
             res.send("error");
        }
        else{
            res.send("success");
        }
});
Run Code Online (Sandbox Code Playgroud)

这是我用来删除字段'image_id'的索引的代码.当我尝试执行此函数时,它显示"TypeError:Imagdata.dropIndexes不是函数".如何解决这个问题......

mongoose mongodb mongoose-schema

1
推荐指数
1
解决办法
3889
查看次数

如何在 MongoDB 中限制删除以进行关系收集

例如,我们可以考虑以下模型:

Companies {Name: string, Address:string}

Employees {FirstName: string, 
           lastName:String, 
           Company: {type:mongoose.schema.objectID,ref:companies}
}
Run Code Online (Sandbox Code Playgroud)

需要限制删除在数据库级别拥有员工记录的公司,而不使用“预”中间件。

我正在寻找一些类似于 MySQL 关系约束的解决方案 - 删除限制。

mongoose mongodb mongoose-schema

1
推荐指数
1
解决办法
3248
查看次数

将猫鼬模式导入另一个模式文件会使导入的模式未定义

文件结构:

?   resolvers.js
?   schema.js
?
????schemas
        matchesSchema.js
        playersSchema.js
        teamsSchema.js
        tournamentsSchema.js
Run Code Online (Sandbox Code Playgroud)

所以我有 4 个模式,我想在我所有的模式中使用其他模式,但是当我导入它时,我收到一个错误:

C:\Users\phara0h\Dropbox\esports-scores.com\nodeTest\node_modules\mongoose\lib\schema.js:425
      throw new TypeError('Invalid value for schema Array path `' + prefix + key + '`');
      ^

TypeError: Invalid value for schema Array path `matches`
    at Schema.add (C:\Users\phara0h\Dropbox\esports-scores.com\nodeTest\node_modules\mongoose\lib\schema.js:425:13)
    at new Schema (C:\Users\phara0h\Dropbox\esports-scores.com\nodeTest\node_modules\mongoose\lib\schema.js:99:10)
    at Object.<anonymous> (C:/Users/phara0h/Dropbox/esports-scores.com/nodeTest/src/schemas/tournamentsSchema.js:8:34)
    at Module._compile (module.js:570:32)
    at loader (C:\Users\phara0h\Dropbox\esports-scores.com\nodeTest\node_modules\babel-register\lib\node.js:144:5)
    at Object.require.extensions.(anonymous function) [as .js] (C:\Users\phara0h\Dropbox\esports-scores.com\nodeTest\node_modules\babel-register\lib\node.js:154:7)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.require (module.js:497:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (C:/Users/phara0h/Dropbox/esports-scores.com/nodeTest/src/schemas/teamsSchema.js:5:1)
    at …
Run Code Online (Sandbox Code Playgroud)

javascript mongoose mongodb node.js mongoose-schema

1
推荐指数
1
解决办法
3611
查看次数

Mongoose,正确的方法来访问实例方法中的实例字段

我正在尝试在Model上实现实例函数.它检查模型实例的字段值expiresAt是否超出特定时间戳.这是我的架构

let MySchema = new mongoose.Schema({
   userId : { type : ObjectId , unique : true, required: true },
   provider : { type : String, required : true},
   expiresAt : { type : Number, required : true}
},{ strict: false });
Run Code Online (Sandbox Code Playgroud)

这是实例方法

MySchema.methods.isExpired = () => {
    console.log(this.expiresAt) // undefined
    return ( this.expiresAt < (Date.now()-5000) )
};
Run Code Online (Sandbox Code Playgroud)

但是价值this.expiredAt是未定义的.然后我尝试重写该函数如下

MySchema.methods.isExpired = () => {
   try{
       console.log(this._doc.expiresAt);
       console.log((Date.now()-5000));
       return (this._doc.expiresAt < (Date.now()-5000));
   } catch (e){
       console.error(e);
   }
}; …
Run Code Online (Sandbox Code Playgroud)

mongoose node.js mongoose-schema

1
推荐指数
1
解决办法
618
查看次数

Mongoose模式创建空数组字段

在我的Food架构中,我根据其他字段调用了不同的字段yummy.例如:

  • 如果yummy等于pancake,我的领域是doughjam
  • 如果yummy等于pizza,我的领域是dough,meatcheese

它在保存文档时按预期工作 - 我只是传递我希望按文档保存的字段,因为除了之外都不需要它们yummy.所以,如果我保存:

{
   yummy: 'pizza'
   dough: 'thin'
   meat : 'peperroni',
   cheese: [ObjectId("59a65a4f2170d90b0436ed4b")] // refs to the cheeses collection.
}
Run Code Online (Sandbox Code Playgroud)

我的文件看起来像预期的.

问题出在领域type: Array.当我保存:

{
    yummy: 'pancake',
    dough: 'thick',
    jam: 'blueberry'
}
Run Code Online (Sandbox Code Playgroud)

我的文档保存了一个附加cheese: []字段.在我的模式中,cheese定义如下:

Mongoose.model('Food', {
    ...
    cheese: { 
        type: [{ type: Mongoose.Schema.ObjectId, ref: 'Cheese' }], 
        required: false 
    },
    ...
});
Run Code Online (Sandbox Code Playgroud)

我检查了mongo是否需要doc将数组字段预定义为空,以防 …

javascript mongoose node.js mongoose-schema

1
推荐指数
1
解决办法
467
查看次数

在db.collection.findOne中传递变量({parm:value}

我正在尝试创建一个方法,该方法将基于参数和类似值从集合中获取记录.

其中parm例如此模式中的_id字段.

getRecord('_id', '1234567876543')

getRecord(parm, value){
    db.collection.findOne( { parm : value } , function(err, item) {
        if (err) {
            console.error(err);
        }else if (item === null ) {
            console.error('record does not exist');
        }else {
            Record = JSON.stringify(item); 
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

发生的事情是这段代码试图从不存在的表中获取colum parm,每次返回记录都不存在.

如何在findOne查询中传递参数的值?

mongoose mongodb node.js mongoose-schema

1
推荐指数
1
解决办法
481
查看次数

猫鼬总是返回空数组?

进出口新的nodejs.i已经与集合名称PLN名为AQI分贝。我试着去显示所有在收集网页上的记录,但猫鼬总是返回空数组。我曾与其他DBS测试,但我可以从他们那里得到的数据但PLN猫鼬总是返回空数组。我真的很感激,如果有人可以帮助我。这是我的架构

var Pln = new Schema({
    latit      : Number,
    longit     : Number,
    timestmp   : String,
    co         : Number,
    smoke      : Number,
    O3         : Number,
    humidity   : Number,
    temperature: Number,
    co2        : Number,
    dust       : String
});
var plnModel = mongoose.model('pln', Pln);
Run Code Online (Sandbox Code Playgroud)

这是我的路线。

app.get('/', function(req, res) {
    res.contentType('application/json'); 
    plnModel.find({}, function(err, pln) {
        if (pln != null) {
            console.log('Found the User:' + pln.latit);
            res.send(JSON.stringify(pln));
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

mongodb node.js mongoose-schema

1
推荐指数
1
解决办法
779
查看次数

将上传的文件引用到新集合的 Multer gridfs 存储

使用 multer gridfs 存储上传的文件我想将它引用到新创建的集合(电影)。我引用上传文件的文件 ID 与上传文件不同,即使电影收藏没有保存到数据库中。我引用上传的文件的文件 ID 与上传的文件不同,即使电影收藏没有保存在数据库中

//movie schema
    const mongoose = require('mongoose');
    const Schema = mongoose.Schema;

    const MovieSchema = new Schema({
    	description: {
    		type: String,
    	},
    	category: {
    		type: String,
    	},
    	token: {
    		type: String,
    	},
    	fileID: {
    		type: Schema.Types.ObjectId,
    		ref: "contents.files"
    	}
    });

    module.exports = movies = mongoose.model('movies', MovieSchema);



    let gfs;

    conn.once('open', () => {
        gfs = Grid(conn.db, mongoose.mongo);
        gfs.collection('contents');

    });



    const storage = new GridFsStorage({
        url: config.db,
        file: (req, file) => {
            return new Promise((resolve, reject) …
Run Code Online (Sandbox Code Playgroud)

node.js multer mongoose-schema multer-gridfs-storage

1
推荐指数
1
解决办法
3357
查看次数