[MongoDB] “$err” : “Can’t canonicalize query: BadValue cannot compare to undefined”, “code” : 17287 の解決方法
MongoDB で “$err” : “Can’t canonicalize query: BadValue cannot compare to undefined”, “code” : 17287 エラーが発生したときの解決方法をご紹介します。
BadValue cannot compare to undefined エラーの再現コード
> db.users.findOne({ _id: undefined }); 2018-09-20T17:51:00.428+0900 E QUERY [thread1] Error: error: { "$err" : "Can't canonicalize query: BadValue cannot compare to undefined", "code" : 17287 } : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DBQuery.prototype.next@src/mongo/shell/query.js:297:1 DBCollection.prototype.findOne@src/mongo/shell/collection.js:291:15 @(shell):1:1 |
BadValue cannot compare to undefined エラーの解決案
以下のように存在チェックせず、MongoDB クエリを実行していくと “Can’t canonicalize query: BadValue cannot compare to undefined” エラーにたまに遭遇することがあります。
var comment = db.comments.findOne(); var user = db.users.findOne({ _id: comment.user }); // comment.user が undefined だった場合、以下のエラーが発生します。 /** E QUERY [thread1] Error: error: { "$err" : "Can't canonicalize query: BadValue cannot compare to undefined", "code" : 17287 } **/ |
var comment = db.comments.findOne(); // comment.user に値が保存されている保証が無い場合、面倒ですが存在チェックするしか無いですかね if (comment && comment.user) { var user = db.users.findOne({ _id: comment.user }); } |
以上、undefined な変数を MongoDB クエリの条件に適用してるコードに遭遇した、現場からお送りしました。