小编Jus*_*tin的帖子

具有一对多关系的Mongoose文档引用

我正在为一个新项目设计数据库结构,我对MongoDB很新,显然是Mongoose.

我已经阅读过Mongooses 人口文档,它有一对多的关系,一个Person文档到很多Story文档,但是令我困惑的部分是在哪里而不是Story引用Person它所属的文档的文档,Person架构设置了它所以它有一个Story"拥有"的文件数组.

我正在设置与此类似的东西.但我一直认为创建新Story文档以获取Person文档ID 会更容易.但也许这只是因为我更熟悉使用连接的MySQL关系.

如果这是最好的方法(并且我确定它是,因为它在文档中),在Story创建新文档时,最新的方法是更新People它所属的相关文档中的故事数组?我看了但找不到任何更新现有文档的例子来添加对其他文件的引用(或删除它们)

我确信这是一个简单的解决方案,我只是忽略了什么,但任何帮助都会很棒.谢谢!

mongoose mongodb node.js mongodb-query mongoose-schema

38
推荐指数
3
解决办法
5万
查看次数

在保存和保存后保存Mongoose中间件方法之间的数据

查看更新示例代码@BOTTOM

我在我的当前项目的NodeJS利用猫鼬(这是真棒顺便说一句!),我有一个MDB集合多数民众赞成要存储的文件在不同的集合的变化(基本上是一个更新日志存储了什么修改)

我如何努力实现这一点是创建一个存储文档的JSON版本的函数,这是通过pre('save')钩子完成的.然后创建另一个钩子,通过它执行post('save'),比较存储的数据pre('save'),并将其与文档新数据进行比较.

这是我到目前为止所拥有的:

var origDocument 
var testVar = 'Goodbye World'

module.exports = ( schema, options ) => {
    schema.pre( 'save', function( next ) {
        // Store the original value of the documents attrCache.Description value
        origDocument = this.toJSON().attrCache.Description

        // Change the testVar value to see if the change is reflected in post(save)
        testVar = 'Hello World'
        next()
    } )

    schema.post( 'save', function(  ) {
        // Attempt to compare the documents previous value …
Run Code Online (Sandbox Code Playgroud)

javascript mongoose mongodb node.js mongoose-schema

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

为任何更新查询增加Mongoose文档版本的简便方法?

我想开始利用Mongooses文档版本控制(__v key).我有一个实际增加版本值的问题,然后我发现你必须this.increment()在执行查询时添加.

有没有办法自动递增?目前,我刚刚将它添加到中间件以获取更新类型的查询:

module.exports = Mongoose => {
    const Schema = Mongoose.Schema

    const modelSchema = new Schema( {
        name: Schema.Types.String,
        description: Schema.Types.String
    } )

    // Any middleware that needs to be fired off for any/all update-type queries
    _.forEach( [ 'save', 'update', 'findOneAndUpdate' ], query => {
        // Increment the Mongoose (__v)ersion for any updates
        modelSchema.pre( query, function( next ) {
            this.increment()
            next()
        } )
    } )
}
Run Code Online (Sandbox Code Playgroud)

这似乎有用..但我有点认为在Mongoose中已经有办法做到这一点..我错了吗?

javascript mongoose mongodb node.js mongoose-schema

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

使用参数变量将参数传递给ES6箭头函数

我理解箭头函数在ES6中是如何工作的,以及词汇这个,但是我想知道是否有人知道如何将参数传递给箭头函数?

在ES5中,您可以简单地执行以下操作:

function foo( bar, baz ){
    console.log('Args:', arguments.join(', '))
}
Run Code Online (Sandbox Code Playgroud)

但是,在ES6中,如果使用箭头功能,如下所示:

const foo = ( bar, baz ) => {
    console.log('Args:', arguments.join(', '))
}
Run Code Online (Sandbox Code Playgroud)

arguments变量返回一个对象,该对象与参数无关.

所以,我想知道是否有人有办法将参数传递给箭头函数?


编辑

我想也许我应该提供一些关于我想要完成的事情的信息,也许如果以上是不可能的,有人有更好的主意.

基本上,我正在向BluebirdJS asCallback方法添加一个IIEF ,它将确定是否实际提供了回调,如果没有,则返回promise.

下面是ES5中的一个工作示例:

var _ = require('lodash')
var Promise = require('bluebird')

function testFunc( foo, callback ) {
    return new Promise( function ( res, rej ){
        res('You Said: ' + (_.isString( foo ) ? foo : 'NOTHING') )
    })
        .asCallback((function ( args ) {
            return _.findLast(args, function(a) { …
Run Code Online (Sandbox Code Playgroud)

javascript arguments lexical-closures callback ecmascript-6

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

单独测试单独文件中的Mongoose模型会导致问题(使用Mockgoose&Lab)

每当Mongoose模型在加载后尝试加载时,都会抛出错误,例如:

错误:uncaughtException:Account编译后无法覆盖模型.date = Fri Feb 26 2016 10:13:40 GMT-0700(MST),pid = 19231,uid = 502,gid = 20,cwd =/Users/me/PhpstormProjects/project,execPath =/usr/local/Cellar/node/0.12.4/bin/node,version = v5.2.0,argv = [/ usr/local/Cellar/node/0.12.4/bin/node,/ usr/local/Cellar/node0.12.4/bin/lab],rss = 73306112,heapTotal = 62168096,heapUsed = 29534752,loadavg = [1.6005859375,1.84716796875,1.8701171875],uptime = 648559 OverwriteModelError:Account编译后无法覆盖模型.

我很好,但现在我正在为我的模型编写单元测试,我遇到了一个问题.

只是一些关于文件结构的基本信息......

我将所有Mongoose模型放在文件src/models/夹内的单独文件中,并且要加载这些模型,只需要文件夹,将Mongoose对象传递给它,src/models/index.js文件将加载所有模型,并返回一个对象楷模.这个index.js文件可以在这里看到(而不是它的相关,但模型名称基本上是文件名,没有.js)

现在,模型的单元测试也分成单独的文件.每个模型都有一个测试文件.即使每个单元测试文件都关注特定模型,其中一些也使用其他模型(用于之前/之后的任务).

初始问题

我刚刚创建了第二个单元测试文件,当我独立执行每个单元时,它们工作得很好.但是当我执行所有这些操作时,我收到上述错误,说明我试图多次加载模型.因为我需要./models在每个单元测试用例中,所以不止一次加载它们.

第一次决议尝试

我想也许我可以after()在每个单独的单元测试文件中清除所有加载的模型,如下所示:

after(function(done) {
    mongoose.connection.close(function() {
        mongoose.connection.models = {}
        done()
    })
})
Run Code Online (Sandbox Code Playgroud)

哪个根本不起作用(没有新的错误,但是一旦编译错误仍然存​​在,同样不能覆盖Account模型 …

unit-testing mocking mongoose node.js lab

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

根据Mongoose模式验证对象,而无需另存为新文档

我正在尝试验证将要插入到新文档中的某些数据,但是在需要执行许多其他操作之前,这并不是必须的。因此,我将向静态方法添加一个函数,该函数有望针对模型模式验证数组中的对象。

到目前为止的代码如下:

module.exports = Mongoose => {
    const Schema = Mongoose.Schema

    const peopleSchema = new Schema({
        name: {
            type: Schema.Types.String,
            required: true,
            minlength: 3,
            maxlength: 25
        },
        age: Schema.Types.Number
    })

    /**
     * Validate the settings of an array of people
     *
     * @param   {array}     people  Array of people (objects)
     * @return  {boolean}
     */
    peopleSchema.statics.validatePeople = function( people ) {
        return _.every(people, p => {
            /**
             * How can I validate the object `p` against the peopleSchema
             */
        })
    }

    return …
Run Code Online (Sandbox Code Playgroud)

validation mongodb node.js mongoose-schema

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

KnexJS迁移与相关种子数据

我正在学习BookshelfJS / KnexJS(从SequelizeJS切换),并且遇到了将数据导入通过KnexJS中的迁移功能创建的多个表中的问题。有4张桌子:

  1. servers
  2. operating_systems
  3. applications
  4. applications_servers

具有以下约束:

  • serversoperating_system_id参考operating_systemsid
  • applications_serversserver_id参考serversid
  • applications_serversapplication_id参考applicationsid

在运行时创建表就很好了knex migrate:latest --env development servers,就是在将种子数据导入表中时出现错误。

最初,我将4个表的种子数据组织为目录中的4个不同文件./seeds/dev,即${table_name}.js

  1. operating_systems.js
  2. servers.js
  3. applications.js
  4. applications_servers.js

有点调试后,我又意识到正在生成的错误时,文件中的种子数据applications_servers.js,因为当我拿一个出来,其他3跑就好了。然后,当我删除3个种子文件并将applications_servers.js移至./seeds/dev/目录并执行时knex seed:runapplicationsservers表就可以很好地填充了。但是,当我尝试一次导入所有4个文件的种子数据时,收到以下错误:

# knex seed:run
Using environment: development
Error: ER_NO_REFERENCED_ROW_2: Cannot add or update a child row: a foreign key constraint fails (`bookshelf_knex_lessons`.`applications_servers`, CONSTRAINT `applications_servers_server_id_foreign` …
Run Code Online (Sandbox Code Playgroud)

javascript mysql node.js bookshelf.js knex.js

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

在 Python 中深度嵌套类 3 层 - 这是不好的做法吗?

我正在工作中编写一个 Python 脚本,用于与 XLS/XLSX/CSV 电子表格进行交互。存在三个相互嵌套的主要类(相互扩展,这些类实际上位于另一个类内部)

三个主要类解释如下:

  1. Workbook类,它是 XLS/XLSX/CSV 类的工厂方法。这是可以从外部访问的
  2. __Worksheet类中的私有类Workbook,用于打开文件本身中的特定电子表格或工作表。这只能通过Workbook.worksheet()方法访问
  3. __Cell类中的私有类__Worksheet,与单元本身交互。这不应该从外部访问,而只能通过__Worksheet类访问

这是迄今为止类结构的简化版本:

class Workbook( object ):

    def __init__( self, file_name ):
        self.__file_name = file_name

    def worksheet( self, name ):
        return self.__Worksheet( self, name )

    class __Worksheet():
        def __init__( self, workbook, worksheet ):
            self.__workbook = workbook

        def cell( self, cell_id, data = None ):
            return self.__Cell( cell_id, data )

        class __Cell():
            def __init__( self, cell, data = …
Run Code Online (Sandbox Code Playgroud)

python oop class subclass

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