第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在任意深度找到MongoDB字段名稱

如何在任意深度找到MongoDB字段名稱

犯罪嫌疑人X 2019-08-23 09:24:51
如何在任意深度找到MongoDB字段名稱我將一些草率的XML數(shù)據(jù)導(dǎo)入Mongo數(shù)據(jù)庫。每個Document都有嵌套的子文檔,深度約為5-10。我想找到()具有特定字段特定值的文檔,其中字段可能出現(xiàn)在子文檔的任何深度(并且可能出現(xiàn)多次)。我目前正在將每個Document拉到Python中,然后搜索該字典,但如果我能說出一個過濾器原型,數(shù)據(jù)庫只會返回其內(nèi)容中某處具有特定字段名稱值的文檔,那就太好了。這是一個示例文檔:{     "foo": 1,     "bar": 2,     "find-this": "Yes!",     "stuff": {         "baz": 3,         "gobble": [             "wibble",             "wobble",             {                 "all-fall-down": 4,                 "find-this": "please find me"             }                         ],         "plugh": {             "plove": {                 "find-this": "Here too!"             }         }    }}所以,我想找到具有“find-this”字段的文檔,并且(如果可能的話)能夠找到具有“find-this”字段的特定值的文檔。
查看完整描述

2 回答

?
MMMHUHU

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ù)重新組織成更可行的形式即可。

但這會給你你的比賽。


查看完整回答
反對 回復(fù) 2019-08-23
?
慕蓋茨4494581

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;
        }       
    }    })


查看完整回答
反對 回復(fù) 2019-08-23
  • 2 回答
  • 0 關(guān)注
  • 1035 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號