iT邦幫忙

1

mongodb 數字查詢

const number =req.body.number;
{ $expr: { $lte: [ { $toInt: "$rent" }, number ] } }

請問各位大大
我在測試的時候 手動輸入是可以的 像下面這樣

{ $expr: { $lte: [ { $toInt: "$rent" }, 1000 ] } }

這樣是搜尋得出來,但今天如果我自己拿前端的值來用時
他就查不出來了..我看值也是說undefined 但我不太知道哪邊出問題
之前也是這樣要值的
該從哪邊下手處理呢 還是語法有錯
先感謝!!

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
dragonH
iT邦超人 5 級 ‧ 2019-10-23 00:39:17
最佳解答

估計你的 number 不是數字了

typeof number 或者把 number 印出來試試看吧

看看吧

以下實測

(async () => {
  const collection = db.get('ithelp');
  const number = 1000;
  const result1 = await collection.find({ $expr: { $lte: [ { $toInt: '$rent' }, number ]}})
  console.log(result1);
  console.log('---------------');
  const string = '1000';
  const result2 = await collection.find({ $expr: { $lte: [ { $toInt: '$rent' }, string ]}})
  console.log(result2);
})()

result1

[ { _id: 5daf2bda0edb25e20165129a, rent: '1000' } ]

result2 (以文字查詢會把所有印出來)

[ { _id: 5daf2bda0edb25e20165129a, rent: '1000' },
  { _id: 5daf2bf8e209f9063963e76e, rent: '2000' },
  { _id: 5daf2bf8e209f9063963e770, rent: '3000' },
  { _id: 5daf2bf8e209f9063963e772, rent: '4000' },
  { _id: 5daf2c32e209f9063963e78a, rent: '5000' } ]
看更多先前的回應...收起先前的回應...

dragonH我自己設const number= 1000;
可以索引出來
然後看type好像也是undefined
前端就一個很普通的input而已
但我怎麼req都不行

dragonH iT邦超人 5 級 ‧ 2019-10-23 09:13:03 檢舉

shrine90459

那你可能就要在前端用 browser network 看

到底傳了什麼到後端

確定有傳之後

在後端把 req.body 印出來看有沒有問題

dragonH
我後來發現 我把它改成req.query就找的到了好像是因為他在同一個query表單內
不過現在又出現一個問題就是他雖然有值
但還是查不到 似乎不是int?
我req.query出來的值是
{ search: '', price: '3000' }
這樣 但查不出東西

像我自己設a=3000 console.log(a)出來的3000黃色的字
但我用如果req.query的值是白色的字 不過我應該已經有轉成int了才對...

dragonH iT邦超人 5 級 ‧ 2019-10-23 20:54:22 檢舉

shrine90459

你前端是用什麼方式傳值的

為什麼會是在 req.query

通常會是 query string 才會在 req.query

像我自己設a=3000 console.log(a)出來的3000黃色的字

基本上

你還是要在後端做這些參數的驗證

因為你沒辦法保證

這些到你後端的 http request

一定有經過你的前端

老話一句

永遠不要相信前端來的東西/images/emoticon/emoticon49.gif

沒錯, 我只相信新台幣 ! 不相信前端的東西 /images/emoticon/emoticon01.gif

dragonH iT邦超人 5 級 ‧ 2019-10-23 21:11:02 檢舉

新台幣也有假鈔XD /images/emoticon/emoticon50.gif

dragonH

  form(action='/articles/search' method='get')
                          input(type='number' name='price' placeholder='租金範圍')
                          input.form-control(name='search' type='text' placeholder='輸入' style='height:50px; font-size: 16px;')

router.get('/search' ,function(req,res,next){
  const a=3000;
  const price=req.query.price;
  parseInt(test);
  const regex = new RegExp(req.query.search, 'gi');
  const result=Article.find({$and:[{$or:[{address:regex},{name:regex}]},{ $expr: { $lte: [ { $toInt: "$rent" }, price ] } }]},function(err,article){
    if(err){
      console.log(err);
    }
    else{
      console.log(req.query);
      res.render('house',{article:article});

    }
  }
  );

});

我前端是一個form的方式傳值
我也不知為什麼我req.body會undefined
然後用req.query就可以了...
難道是因為他們兩個input被包在一起了嗎
那我有辦法在後端再轉int嗎
我有查一個parseInt的方法好像行不通

dragonH iT邦超人 5 級 ‧ 2019-10-23 21:23:54 檢舉

shrine90459

因為你用的是 get 阿

所以才會在 req.query 中找到

那我有辦法在後端再轉int嗎

應該是有很多方法

e.g. Number(number)

看起來比較厲害的可以用

~~'1234'

parseInt 應該也是可以

不知道你遇到的問題是什麼

dragonH
我剛剛parseInt打在裡面突然就可以了 嗚嗚嗚
原來get跟post req的東西不一樣 又學到了
感謝大大 後端真的還有好多東西要摸

Article.find({$and:[{$or:[{address:regex},{name:regex}]},{ $expr: { $lte: [ { $toInt: "$rent" }, parseInt(price) ] } }]}
dragonH iT邦超人 5 級 ‧ 2019-10-23 21:37:23 檢舉

/images/emoticon/emoticon42.gif/images/emoticon/emoticon42.gif/images/emoticon/emoticon42.gif

假鈔是 dragonH 印的 /images/emoticon/emoticon39.gif

dragonH iT邦超人 5 級 ‧ 2019-10-23 22:37:24 檢舉

假鈔是 dragonH 印的

這樣也被你發現

/images/emoticon/emoticon48.gif/images/emoticon/emoticon48.gif/images/emoticon/emoticon48.gif

喂喂喂 警察局ㄇ.jpg

0
Darwin Watterson
iT邦好手 1 級 ‧ 2019-10-22 23:56:07

可先試試

const number = 1000;
{ $expr: { $lte: [ { $toInt: "$rent" }, number ] } }

看能不能檢索出來 !

感覺有點像是在比較 小於等於 時, number 被判定為 req.body.number

Syntax: { field: { $lte: value} }

darwin0616我 自己設const number= 1000;
可以索引出來
但從前端req就不行了

那就是req.body.number這段沒抓到「數值」造成的結果!參考下下面dragonH的方法把req.body.number的值印出來看看吧!

我要發表回答

立即登入回答