1. 程式人生 > >mongodb,$where內嵌指令碼

mongodb,$where內嵌指令碼

在使用mongodb的時候,有遇到這種情況,查詢某個欄位長度大於10的記錄。

由於mongodb是json文件結構,要找出有問題的資料也不容易,

有些情況下,可以劃分為垃圾資料,

1、一些欄位的長度超出不正常範圍的時候。

2、型別與你預想的不一致,如應該為NumberInt的欄位,有字串,或者其他型別。

這些情況下我們可以使用$where將這些記錄篩選出來。

一、shell指令碼的方式

var cursor = db.d_goods.find(
{"$where":function(){
  var specification = this.specification;
   //返回這個欄位不是string型別的記錄
  if(specification!=null && typeof specification!='string'){
    return true;
  }
   //返回欄位不為空且字串長度大於10的記錄
  //return this.specification!=null&&this.specification.length>10;
  }
});
//列印結果記錄
while(cursor.hasNext()){
  var goods = cursor.next();
  printjson(goods);
}

這樣就將specification欄位有問題的記錄找出來了。

二、morphia方式

在使用java呼叫morphia的時候,意外注意到Query<T> 中有where()函式:

Query<T> where(CodeWScope js);

Query<T> where(String js);

這是個好訊息,意味著上面我們可以對上面的shell指令碼進行morphia改裝了,我之前的部落格有一篇是分組聚合查詢,js內嵌,在這個時候找到了一般查詢的內嵌指令碼,也算是一個補充了。