2017-04-25 102 views
1

需要幫助構建這個mongo查詢。 到目前爲止,我可以在第一級別查詢,但無法在接下來的嵌入級別這樣做(「標籤」> 2" )如何使用mongodb查詢嵌入式文檔

例如,文檔結構如下:

> db.versions_20170420.findOne(); 
{ 
    "_id" : ObjectId("54bf146b77ac503bbf0f0130"), 
    "account" : "foo", 
    "labels" : { 
     "1" : { 
      "name" : "one", 
      "color" : "color1" 
     }, 
     "2" : { 
      "name" : "two", 
      "color" : "color2" 
     }, 
     "3" : { 
      "name" : "three", 
      "color" : "color3" 
     } 
    }, 
    "profile" : "bar", 
    "version" : NumberLong("201412192106") 

該查詢我可以在第一級(account, profile)濾波器。

db.profile_versions_20170420.find({"account":"foo", "profile": "bar"}).pretty() 

然而,由於這種結構,我正在尋找的文件,其中"label">"2"它看起來並不像"2"。是多少,但是一個字符串。有沒有辦法構建mongo查詢來做到這一點?我需要做一些轉換嗎?

回答

1

如果我正確理解你和你的數據結構,"label" > "2"意味着對象標籤內容必須包括財產labels.3,而且很容易檢查與下面的代碼:

db.profile_versions_20170420.find(
    {"account": "foo", "profile": "bar", "labels.3": {$exists: true}} 
).pretty(); 

不過,這並不意味着你的對象包含至少3個屬性,因爲它不是$size函數,它計算數組中的元素的數量,並且我們不能使用$ size,因爲labels是對象而不是數組。因此,在我們的案例中,我們只知道labels有屬性3,即使它是標籤包含的唯一屬性。

可以提高查找條件:

db.profile_versions_20170420.find({ 
    "account": "foo", 
    "profile": "bar", 
    "labels.1": {$exists: true}, 
    "labels.2": {$exists: true}, 
    "labels.3": {$exists: true} 
}).pretty(); 

,並確保labes包含元素1, 2, 3,但在這種情況下,必須插入/更新過程中關心的應用程序級的對象結構/文件刪除數據。

作爲另一個選項,您可以更新數據庫,並添加額外的場labelsConut之後,你將能夠運行這樣的查詢:

db.profile_versions_20170420.find(
    {"account": "foo", "profile": "bar", "labelsConut": {$gt: 2}} 
).pretty(); 

順便說一句,它的運行速度更快...