[MongoDB] "$err" : "Can't canonicalize query: BadValue cannot compare to undefined", "code" : 17287 の解決方法

Tadashi Shigeoka ·  Tue, September 18, 2018

MongoDB で “$err” : “Can’t canonicalize query: BadValue cannot compare to undefined”, “code” : 17287 エラーが発生したときの解決方法をご紹介します。

MongoDB | モンゴディービー

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 クエリの条件に適用してるコードに遭遇した、現場からお送りしました。