質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

4452閲覧

MongoDBでの重複エラーの回避方法について

nocturnum

総合スコア8

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

0クリップ

投稿2018/01/06 08:47

###前提・実現したいこと
Node.jsを用いたサーバー上で、クライアントから送られてきた文字列を正規表現によって複数の変数に分割したうえで
MongoDBのスキーマとしてそれぞれ保存する処理。
また、保存される情報のうち_id以外はユニークではありません。
###発生している問題・エラーメッセージ
クライントから文字列を送信する際、2度目以降にunique:falseであるフィールドが原因のduplicateエラーが発生してしまいます。

text

1{ MongoError: insertDocument :: caused by :: 11000 E11000 duplicate key error index: test.error.$textId_1 dup key: { : "修正点:1: 行6、列13に誤りがあります" } 2 at Function.MongoError.create (/home/user/ドキュメント/Book_Checker/node_modules/mongoose/node_modules/mongodb-core/lib/error.js:31:11) 3 at toError (/home/user/ドキュメント/Book_Checker/node_modules/mongoose/node_modules/mongodb/lib/utils.js:139:22) 4 at /home/user/ドキュメント/Book_Checker/node_modules/mongoose/node_modules/mongodb/lib/collection.js:668:23 5 at handleCallback (/home/user/ドキュメント/Book_Checker/node_modules/mongoose/node_modules/mongodb/lib/utils.js:120:56) 6 at /home/user/ドキュメント/Book_Checker/node_modules/mongoose/node_modules/mongodb/lib/bulk/unordered.js:465:9 7 at handleCallback (/home/user/ドキュメント/Book_Checker/node_modules/mongoose/node_modules/mongodb/lib/utils.js:120:56) 8 at resultHandler (/home/user/ドキュメント/Book_Checker/node_modules/mongoose/node_modules/mongodb/lib/bulk/unordered.js:413:5) 9 at /home/user/ドキュメント/Book_Checker/node_modules/mongoose/node_modules/mongodb-core/lib/connection/pool.js:469:18 10 at _combinedTickCallback (internal/process/next_tick.js:131:7) 11 at process._tickCallback (internal/process/next_tick.js:180:9) 12 name: 'MongoError', 13 message: 'insertDocument :: caused by :: 11000 E11000 duplicate key error index: test.error.$textId_1 dup key: { : "修正点:1: 行6、列13に誤りがあります" }', 14 driver: true, 15 code: 11000, 16 index: 0, 17 errmsg: 'insertDocument :: caused by :: 11000 E11000 duplicate key error index: test.error.$textId_1 dup key: { : "修正点:1: 行6、列13に誤りがあります" }', 18 getOperation: [Function], 19 toJSON: [Function], 20 toString: [Function] }

###該当のソースコード
該当DBのスキーマ

javascript

1var mongoose = require('mongoose'); 2var Schema = mongoose.Schema; 3var Errors = new Schema({ 4 textId : {type: String, require: true, unique: false}, //errorの種類 5 message : {type: String, require: true}, //全文 6 fileName : {type: String, require: true} //発生したファイル名 7}); 8module.exports = mongoose.model('Error', Errors, 'error');

サーバー側js (抜粋)

javascript

1 var ErrModel = require('./models/errors'); 2 var err = new ErrModel(); 3 var str = <送信されてきた全文>; 4 var filepath = <path> + <fileName>; 5 6 var id = str.match(/(修正点:.*)/g); 7     var text = str.match(new RegExp("(" + filepath + ":[0-9]:)[\s\S]*?\^\n","g")); 8 var filename = <fileName>; 9 10 //同じerrorIdの情報を加えようとするとduplicateになる 11 err.textId = id[0]; 12 err.message = text[0]; 13 err.fileName = filename; 14 15 err.save(function(err){ 16 if(err){ console.log(err); return; } 17 console.log("saved"); 18 });

###試したこと
上記のスキーマの通り、フィールドオプションに「unique:false」を明示しましたが直りませんでした。
また、こちらの確認では_idの値に変化が見られない場合がありました。

###補足情報(言語/FW/ツール等のバージョンなど)
MongoDB shell version: 2.6.10
mongoose: 4.13.7
node: v8.2.1

ご回答よろしくお願いいたします。

lovelock👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しましたので報告いたします。
Errorsスキーマの各フィールドの値を保存するためのコレクションを削除し再度作成したところ、
質問内容のソースコードで成功しました。

以前のスキーマで、textIdに unique:true のオプションを付けた状態で保存していたのでその影響ではないかと考えています。

ご迷惑をお掛けしてすみませんでした。

投稿2018/01/08 03:25

nocturnum

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問