2015-11-17 2 views
2

Я пытаюсь сохранить очень большой текст в моей базе данных mongodb, но он сбой. Я пытаюсь построить менеджер сниппета и это мой код ошибки:Mongoose не сохранит огромный текст

{ [MongoError: Btree::insert: key too large to index, failing beverages.recipes.$code_1 3271 { : "var gulp = require('gulp'); 
var source = require('vinyl-source-stream'); 
var browserify = require('browserify'); 
var browserSync = require('browser-sy..." }] 
    name: 'MongoError', 
    message: 'Btree::insert: key too large to index, failing beverages.recipes.$code_1 3271 { : "var gulp = require(\'gulp\');\nvar source = require(\'vinyl-source-stream\');\nvar browserify = require(\'browserify\');\nvar browserSync = require(\'browser-sy..." }', 
    driver: true, 
    code: 17280, 
    index: 0, 
    errmsg: 'Btree::insert: key too large to index, failing beverages.recipes.$code_1 3271 { : "var gulp = require(\'gulp\');\nvar source = require(\'vinyl-source-stream\');\nvar browserify = require(\'browserify\');\nvar browserSync = require(\'browser-sy..." }', 
    getOperation: [Function], 
    toJSON: [Function], 
    toString: [Function] } 

Это моя Mongoose модель.

import mongoose from 'mongoose'; 

const Schema = mongoose.Schema; 

let recipeSchema = new Schema({ 
    title: { type: String, required: true }, 
    author: { type: String}, 
    tags: { type: String, required: true }, 
    code: { type: String, required: true, unique: true, index: true }, 
    created_at: Date, 
    updated_at: Date 
}); 

recipeSchema.pre('save', function(next) { 

    var recipe = this; 
    // get the current date 
    var currentDate = new Date(); 

    // change the updated_at field to current date 
    recipe.updated_at = currentDate; 

    // if created_at doesn't exist, add to that field 
    if (!recipe.created_at){ 
    recipe.created_at = currentDate; 
    } 

    next(); 
}); 

let Recipe = mongoose.model('Recipe', recipeSchema); 

export default Recipe; 

Если found this on mongodb, но я не знаю, как пользователь его мангуста. Правильно ли это делать?

Это документ, я пытаюсь сохранить

{ title: 'test', 
    tags: 'test', 
    code: 'var gulp = require(\'gulp\');\nvar source = require(\'vinyl-source-stream\');\nvar browserify = require(\'browserify\');\nvar browserSync = require(\'browser-sync\');\nvar nodemon = require(\'gulp-nodemon\');\nvar babelify = require(\'babelify\');\nvar eslint = require(\'gulp-eslint\');\nvar buffer = require(\'vinyl-buffer\');\nvar uglify = require(\'gulp-uglify\');\nvar sourcemaps = require(\'gulp-sourcemaps\');\nvar sass = require(\'gulp-ruby-sass\');\nvar config = require(\'./config\');\nvar imageop = require(\'gulp-image-optimization\');\nvar concat = require(\'gulp-concat\');\n\ngulp.task(\'images\', function(cb) {\n gulp.src(\'./src/assets/images/**/*\')\n .pipe(imageop({\n  optimizationLevel: 5,\n  progressive: true,\n  interlaced: true\n }))\n .pipe(gulp.dest(\'./public/images/\'));\n});\n\n\ngulp.task(\'browser-sync\', [\'nodemon\'], function() {\n browserSync({\n files: [\'public/**/*.*\'],\n proxy: "localhost:" + config.APP_PORT, // local node app address\n port: 5000, // use *different* port than above\n notify: true,\n browser: "google chrome",\n });\n});\n\ngulp.task(\'nodemon\', function(cb) {\n var called = false;\n return nodemon({\n script: \'./index.js\',\n ignore: [\n  \'gulpfile.js\',\n  \'node_modules/\',\n  \'public/,\'\n ]\n })\n .on(\'start\', function() {\n  if (!called) {\n  called = true;\n  cb();\n  }\n })\n .on(\'restart\', function() {\n  setTimeout(function() {\n  browserSync.reload({ stream: false });\n  }, 200);\n });\n});\n\n\ngulp.task(\'browserify\', function() {\n return browserify({entries: \'./src/client/app.js\', extensions: [\'.js\'], debug: true})\n .transform(babelify)\n .bundle()\n .pipe(source(\'app.min.js\'))\n .pipe(buffer())\n .pipe(sourcemaps.init({loadMaps: true}))\n // Add transformation tasks to the pipeline here.\n .pipe(uglify())\n .pipe(sourcemaps.write(\'./\'))\n .pipe(gulp.dest(\'./public/js\'));\n});\n\ngulp.task(\'lint\', function (cb) {\n return gulp.src([\'./src/**/*.js\'])\n .pipe(eslint())\n .pipe(eslint.format())\n .pipe(eslint.failOnError());\n});\n\ngulp.task(\'sass\', function() {\n return sass(\'./src/assets/sass/style.sass\', { sourcemap: true, style: \'compressed\' })\n .on(\'error\', sass.logError)\n .pipe(sourcemaps.write(\'./\', {\n  includeContent: false,\n  sourceRoot: \'source\'\n }))\n .pipe(gulp.dest(\'./public/css/\'));\n});\n\ngulp.task(\'scripts\', function(){\n return gulp.src([\'./src/assets/js/bootstrap.min.js\',\'./src/assets/js/checkbox.js\',\'./src/assets/js/radio.js\',\'./src/assets/js/bootstrap-switch.js\',\'./src/assets/js/toolbar.js\',\'./src/assets/js/application.js\'])\n .pipe(sourcemaps.init())\n .pipe(concat(\'assets.min.js\'))\n .pipe(gulp.dest(\'./public/js/\'))\n .pipe(uglify())\n .pipe(sourcemaps.write(\'./\'))\n .pipe(gulp.dest(\'./public/js/\'));\n});\n\ngulp.task(\'fonts\', function() {\n return gulp.src(\'./src/assets/fonts/**/*\').pipe(gulp.dest(\'./public/fonts/\'));\n});\n\ngulp.task(\'watch\', function() {\n gulp.watch([\'./src/**/*.js\'], [\'lint\', \'browserify\', \'scripts\', browserSync.reload]);\n gulp.watch([\'./src/assets/sass/**/*.sass\'], [\'sass\', browserSync.reload]);\n});\n\ngulp.task(\'serve\', [\'browser-sync\', \'watch\']);\n\ngulp.task(\'default\', [\'browserify\', \'nodemon\', \'sass\', \'scripts\', \'fonts\', \'images\', \'watch\']);' } 

Большое спасибо за вашу помощь!

+2

Какой размер большой? Монго имеет предел по умолчанию 16 МБ на документ, поэтому, если размер вашего текстового поля и остальных данных в документе превышает 16 МБ, Монго выйдет из строя. –

+0

Вот что я пытаюсь отправить: http://pastebin.com/GH239n3a с простым полем «title» и еще одним «тегом», у которого в нем было слово «test» –

+0

Pastebin заблокирован в моей работе, поэтому я не могу посмотрим, но вопрос остается: ** точно ** насколько большой текст, в байтах? –

ответ

2

Похоже, вы пытаетесь использовать поле code в качестве своего индекса. На основе вашей ссылки размер code составляет ~ 3 КБ. У Mongo есть ограничение, которое index fields must not exceed 1KB. 3> 1, поэтому вы получаете эту ошибку.

Вы можете исправить это либо:

  1. Уменьшение размера текста, который вы вводите
  2. Не индексировать на code поле
+0

Я удалил индекс из 'code', и он сработал! –

+0

ой, но почему вы используете индекс, если вам это не нужно? – siavolt

+0

Если есть кто-нибудь вроде меня, кто задается вопросом, почему это не работает для них: попробуйте сохранить новую коллекцию в Mongo. Это исправило это для меня (возможно, удаление индексов из старого тоже могло работать.) –

0

Для индекса использования текстового индекса код поля. Для уникального использования хэш-код формы. Например:

import crypto from 'crypto'; 

let recipeSchema = new Schema({ 
    title: { type: String, required: true }, 
    author: { type: String}, 
    tags: { type: String, required: true }, 
    code: { type: String, required: true }, 
    codeHash: {type: String, unique: true }, 
    created_at: Date, 
    updated_at: Date 
}); 

recipeSchema.index({code: 'text'} 

recipeSchema.pre('save', function( 

    var recipe = this; 
    // get the current date 
    var currentDate = new Date(); 

    // change the updated_at field to current date 
    recipe.updated_at = currentDate; 

    // if created_at doesn't exist, add to that field 
    if (!recipe.created_at){ 
    recipe.created_at = currentDate; 
    } 

    var hash = crypto.createHash('md5').update(this.code).digest("hex") 
    this.codeHash = hash; 
    next(); 
}); 
+0

Зачем мне md5 код? Я просто хочу сохранить его и отобразить, как оно было опубликовано –

+0

Я добавил документ, который я пытаюсь сохранить –

Смежные вопросы