2014-09-24 36 views
3

我的文檔的集合,每一個都帶有一個嵌套的文檔命名爲一「屬性」,在這個例子中:MongoDB的文本搜索與未知結構

document1: { 
    description: 'text text etc', 
    attributes: { 
     Name: 'Alice', 
     Height: '170', 
     FavouriteColour: 'Blue' 
    } 
} 

document2: { 
    description: 'more text etc', 
    attributes: { 
     Name: 'Bob', 
     State: 'NY' 
    } 
} 

我不知道是什麼用戶定義的密鑰名稱。

我想對文檔中的所有屬性的值執行文本搜索,而無需指定鍵,但爲了執行文本搜索,我只需要$text查詢的一個文本索引,所以這是不可能的:

db.collection.aggregate([ 
    {$match: {$text: {$search: 'NY'}}}, 
    {$group: {_id: {$meta: "textScore"}, count: {$sum: 1}}} 
]) 

因爲我不知道是什麼屬性,我可能有,是有辦法解決這一點,並在屬性值進行文本搜索,並返回匹配輸入的文檔?

回答

2

是的。

是:你可以用指數字符串內容各個領域,像這樣:

> db.collection.ensureIndex({ "$**": "text" }, { name: "TextIndex" }) 

Create a Text Index。但是:如果你可以避免它,不要讓你的數據有未知的結構,尤其是如果你讓鍵和值是用戶定義的。你能做點像

{ 
    "description" : "text text etc", 
    "attributes" : [ 
     { "key" : "Name", "value" : "Alice" }, 
     { "key" : "Height", "value" : "170" }, 
     { "key" : "FavouriteColour", "value" : "Blue" } 
    ] 
} 

改爲?見How to Model Dynamic Attributes

+0

您建議的第一種方法適用於我的方案。如何對建議的動態屬性進行建模的替代方法也可以很好地工作,聽起來更加合理和可維護。謝謝! – 2014-09-24 19:30:05