2013-07-31 55 views
0

我有一個集合包含數據:

{ 
    "_id" : ObjectId("51dfb7abe4b02f15ee93a7c7"), 
    "date_created" : "2013-7-12 13:25:5", 
    "referrer_id" : 13, 
    "role_name" : "Physician", 
    "status_id" : "1", 

} 

我送查詢:

cmd { 
    "mapreduce" : "doctor" , 
    "map" : "function map(){emit(this._id,this);}" , 
    "reduce" : "function reduce(key,values){return values;}" , 
    "verbose" : true , 
    "out" : { "merge" : "map_reduce"} , 
    "query" : { "$where" : "this.demographics.first_name=='makdoctest'"} 
} 

我得到的錯誤爲:

"errmsg" : "exception: count failed in DBDirectClient: 10071 error on invocation of $where function:\nJS Error: TypeError: this.demographics has no properties nofile_a:0" 
+2

這意味着,在您的文檔的一個地方'demographics'是'null'或不存在,你需要首先做一個空檢查,但更多的importsantly你爲什麼這個洞在$那裏,它就像你第3次濫用$ where操作符 – Sammaye

+0

@Sammaye爲什麼發表評論,請將其作爲答案 –

+0

你爲什麼使用'$ where'?這是緩慢和難以閱讀和維護。 –

回答

1

由於Sammaye說在評論中:

這意味着您的某個文檔中的某個人口統計信息爲空或不存在,您需要先執行空檢查,但更重要的是,您爲什麼要在$where中對此進行加密?

我會更進一步說,我甚至不會在這裏使用Map/Reduce機制。它慢,不能使用索引,不能與其他人並行運行。

你會最好使用聚合框架,你可以這樣做:

db.doctor.aggregate([ 
    { $match: { "demographics.first_name" : 'makdoctest' } }, 
    { $group: … 

你沒有在這裏指定的最終目標,但一旦你做我可以更新的答案。

+0

事實上,聚合框架(提供了reuslts正在16兆)無疑是更好的答案了,甚至擺脫了'$ where' – Sammaye

+0

@Sammaye骨料的做法,但我想查詢多個集合中的一個短期和返回數據,骨料對於一個集合,結果是內聯的,我們不能臨時存儲每個集合的數據,我需要臨時存儲它,因爲我的不同集合可能具有相同的id字段,所以我需要合併所有這些數據,如果某種方式我可以通過聚合將它存儲在臨時集合中,對於聚合我可以,但是我在mongo db文檔中沒有找到任何東西。 –

+1

@PhalguniMukherjee呃,看看你在做什麼真的很難,我想這是你最後一次告訴我的那個回覆,但我被其他問題分散了。但是MR對於加入數據是非常糟糕的,如果我誠實的話,你最好在你的應用中在客戶端做它 – Sammaye