2 回答

TA貢獻(xiàn)1834條經(jīng)驗 獲得超8個贊
您在BSON文檔的某些聲明中是正確的不是XML文檔。由于XML被加載到包含“節(jié)點”的樹結(jié)構(gòu)中,因此搜索任意鍵非常容易。
MonoDB文檔的處理并不是那么簡單,這在很多方面都是“數(shù)據(jù)庫”,因此通常希望數(shù)據(jù)位置具有一定的“一致性”,以便于“索引”和搜索。
盡管如此,它可以做到。但是,這當(dāng)然意味著在服務(wù)器上執(zhí)行的遞歸過程,這意味著JavaScript處理$where
。
作為一個基本的shell示例,但一般function
只是$where
運算符在其他地方的字符串參數(shù):
db.collection.find( function () { var findKey = "find-this", findVal = "please find me"; function inspectObj(doc) { return Object.keys(doc).some(function(key) { if ( typeof(doc[key]) == "object" ) { return inspectObj(doc[key]); } else { return ( key == findKey && doc[key] == findVal ); } }); } return inspectObj(this); })
所以基本上,測試對象中存在的鍵,看它們是否匹配所需的“字段名稱”和內(nèi)容。如果其中一個鍵恰好是“對象”,則遞歸到函數(shù)中并再次檢查。
JavaScript .some()
確保找到的“第一個”匹配將從搜索函數(shù)返回,給出true
結(jié)果并返回在某個深度存在“鍵/值”的對象。
請注意,這$where
實際上意味著遍歷整個集合,除非有一些其他有效的查詢過濾器可以應(yīng)用于集合上的“索引”。
因此,請謹(jǐn)慎使用,或者根本不使用,只需將數(shù)據(jù)重新組織成更可行的形式即可。
但這會給你你的比賽。

TA貢獻(xiàn)1850條經(jīng)驗 獲得超11個贊
這是一個例子,我用它來在文檔結(jié)構(gòu)的任何地方遞歸搜索Key-Value:
db.getCollection('myCollection').find({ "$where" : function(){ var searchKey = 'find-this'; var searchValue = 'please find me'; return searchInObj(obj); function searchInObj(obj){ for(var k in obj){ if(typeof obj[k] == 'object' && obj[k] !== null){ if(searchInObj(obj[k])){ return true; } } else { if(k == searchKey && obj[k] == searchValue){ return true; } } } return false; } } })
- 2 回答
- 0 關(guān)注
- 1035 瀏覽
添加回答
舉報