2014-11-06 56 views
-1

隨着SQL我們可以做如下聲明:MongoDB的喜歡與多個字段

select * from x where concat(x.y ," ",x.z) like "%find m%" 

當= xy格式 「發現」 和x.z = 「我」。

我怎麼做的MongoDB,當我使用類似的JSON結構,以這種同樣的事情:

{ 
    data: 
    [ 
    { 
     id:1, 
     value : "find" 
    }, 
     { 
     id:2, 
     value : "me" 
    } 
    ] 
} 
+1

沒有與「x.y」或「x.z」對應的字段和完全無效的結構。有點厭倦了「在SQL中我們可以做..」的問題。特別是當這個例子中沒有邏輯結構時。問一個更好的問題。 – 2014-11-06 14:08:15

+0

@NeilLunn請解釋你不瞭解的內容,我可以更好地解釋自己。僅僅因爲你對某些類型的問題「厭倦」而排除這個問題並不是一個好的理由。我確信不止一個人正在爲這類問題而苦苦掙扎。 – user2288183 2014-11-06 14:18:11

+0

好吧,geez。編輯之後,結構至少是有效的。但我在這裏看到的只是「data.value」的一條通用路徑。幾乎沒有你描述的「x.y」「x.z」。不要讓它成爲我的問題。向你想要幫助的人解釋自己是你的工作。否則,你不需要問你是否知道答案。 BTW。花時間提醒你「做得更好」的人通常不是「排名靠後」的人。所以,請放下你的高馬。你問了一個不好的問題。有人爲此低估了你。做得更好。 – 2014-11-06 14:25:55

回答

0

的比較來這裏SQL是無效的,因爲沒有任何關係型數據庫具有相同的概念嵌入式數組,MongoDB具有,並在您的示例中提供。您只能在表格的「行中的字段」之間進行「連接」。基本上不是一回事。

您可以使用的JavaScript評估來做到這一點,但這不是最佳選擇,但它是一個開始。你還可以添加一些額外的「智慧」的比賽以及謹慎:

db.collection.find({ 
    "$or": [ 
     { "data.value": /^f/ }, 
     { "data.value": /^m/ } 
    ], 
    "$where": function() { 
     var items = []; 
     this.data.forEach(function(item) { 
      items.push(item.value); 
     }); 
     var myString = items.join(" "); 

     if (myString.match(/find m/) != null) 
      return 1; 
    } 
}) 

所以你去。我們通過從每個單詞中的「測試字符串」中獲取第一個字符並將這些標記與文檔中數組的每個元素進行比較來優化這一點。

下一部分將數組元素「連接」成一個字符串,然後對連接結果進行「正則表達式」比較(與「like」相同)以查看它是否匹配。那麼文件被視爲匹配並返回。

不是最優的,但這些是MongoDB在像這樣的結構上可用的選項。也許結構應該不同。但是你沒有詳細說明你爲什麼要這樣做,所以我們不能爲你想達到的目標提供更好的解決方案。