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

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

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

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

Node.js

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

Q&A

解決済

1回答

3621閲覧

MongoDBの検索時の$andと$or について

mote

総合スコア128

MongoDB

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

Node.js

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

0グッド

0クリップ

投稿2019/09/17 14:11

MongoDBを使って,検索条件を絞るチェックリストを作りました.
具体的には就活サイトを練習で開発中でして,面接の問題を出力するサイトを構築しております.

検索条件は3パターンあって,
ジャンルを絞る 10種類ほど
年度を絞る  10種類ほど
選考会を絞る  2種類
これらの機能をつけたいです.

JSONでJQueryから

{genre : "IT" , genre : "メーカー"}
のようにチェックリストを追加していくと,JSON形式で溜め込まれて行きます.

これらを
genre ->G
年度 -> Y
選考 -> W
として,

JS

1refine(G,Y,W){ 2 let pr = new Promise(function(resolve, reject){ 3 MongoClient.connect(url, { useNewUrlParser: true },function(err, db) { 4 5 if (err) throw err; 6 let dbo = db.db(account); 7 8 let query ={ $and : [ 9 { $or : G }, 10 { $or : Y }, 11 { $or : W } 12 ]} 13 dbo.collection("question").find(query).toArray(function(err, result) { 14 if (err) throw err; 15 resolve(result) ; 16 console.log(result) 17 db.close(); 18 }); 19 }); 20 }); 21 return pr; 22 } ;

のようにメソッドに渡しています.
一見問題なく動作をするのですが,
1パターンでもチェックを付けないと,

err

12019-09-17T14:05:52.161829+00:00 app[web.1]: /app/node_modules/mongodb/lib/utils.js:133 22019-09-17T14:05:52.161832+00:00 app[web.1]: throw err; 32019-09-17T14:05:52.161835+00:00 app[web.1]: ^ 42019-09-17T14:05:52.161837+00:00 app[web.1]: 52019-09-17T14:05:52.161839+00:00 app[web.1]: MongoError: $and/$or/$nor must be a nonempty array 62019-09-17T14:05:52.161841+00:00 app[web.1]: at Connection.<anonymous> (/app/node_modules/mongodb/lib/core/connection/po 7ol.js:466:61) 82019-09-17T14:05:52.161843+00:00 app[web.1]: at Connection.emit (events.js:198:13) 92019-09-17T14:05:52.161845+00:00 app[web.1]: at processMessage (/app/node_modules/mongodb/lib/core/connection/connection 10.js:364:10) 112019-09-17T14:05:52.161847+00:00 app[web.1]: at Socket.<anonymous> (/app/node_modules/mongodb/lib/core/connection/connection 12

のようにエラーが出てしまいます.
MongoError: $and/$or/$nor must be a nonempty array
を翻訳すると,空白の配列を作るなと怒られています.

しかし,検索の場合には,空白になるパターンになってしまうので,
どうすれば良いかわからない状況です.

試した事 : エラーで検索してもピンとくる答えが得られませんでした.
一番最初に出てくるリンクを読んでみても解決出来ず...

なぜ空白なのに throw err をしてしまうのでしょうか?
是非皆さんのお力をお貸しください.

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

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

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

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

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

guest

回答1

0

ベストアンサー

$andや$orには何かしら条件を指定する必要があって、空白だとだめということです。

なので、G、Y、Wの内容に応じて、queryを

  • 3つとも指定なしなら空のquery {}
  • 1要素だけ指定されていたら単純に1要素の条件検索 { genre: G } とか
  • 2要素指定されていたら { $or: [{ genre: G }, { 年度: Y }] } とか
  • 3要素とも指定されていたら { $or: [ { genre: G }, { 年度: Y }, { 選考: W } ] }

のように作り分ける必要がありますね。

投稿2019/09/21 10:25

kabao

総合スコア648

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

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

mote

2019/09/21 12:06

自分もifで分岐をしていて,もっと簡単に出来ないか不安でした... 納得しました.2つも答えていただきありがとうございます. とても助かりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問