2015-10-20 164 views
1

我試圖在那裏建立一個動詞數據庫:如何在mongodb中查詢並返回嵌套嵌入式文檔中的單個字段?

  • 每個動詞有很多變化形式
  • 每個結合有一個緊張的域名(目前,不完善,...)和多種形式
  • 每個窗體。有人稱代詞(IO,恩,......)和實際結合的動詞(結合)

我選擇了這個結構,因爲我想要做兩種類型的查詢:

  1. 給定一個動詞,緊張和代詞,返回相關的共軛
  2. 給定一個動詞,表明其所有的時態,代詞和動詞變化

我與第一個掙扎。這是我迄今(但它不工作):

db.verbs.findOne({"verb": "comprare", "conjugations": {"$elemMatch": {"tense": "present", "forms.pronoun": "io"}}}, {"conjugations.forms.conjugation": 1}) 

這裏是一個重複的例子:

db.verbs.insert([{ 
        "verb": "comprare", 
        "conjugations": [ 
        { 
         "tense": "present", 
         "forms": [{"pronoun": "io", "conjugation": "compro"}, 
           {"pronoun": "tu", "conjugation": "compri"}], 
        }, 
        { 
         "tense": "imperfect", 
         "forms": [{"pronoun": "io", "conjugation": "compravo"}, 
           {"pronoun": "tu", "conjugation": "compravi"}] 
        } 
        ] 
       }, 
       { 
        "verb": "bere", 
        "conjugations": [ 
        { 
         "tense": "present", 
         "forms": [{"pronoun": "io", "conjugation": "bevo"}, 
           {"pronoun": "tu", "conjugation": "bevi"}] 
        }, 
        { 
         "tense": "imperfect", 
         "forms": [{"pronoun": "io", "conjugation": "bevevo"}, 
           {"pronoun": "tu", "conjugation": "bevevi"}] 
        } 
        ] 
       }]) 

我願意更改數據庫的結構,使它更容易查詢,所以隨時提出一個更自然的方式來做到這一點。

+0

什麼是你的問題? – styvane

回答

1

您可以使用管道中的聚合框架$unwind從嵌套數組創建文檔。你有兩個嵌套數組,所以你會放鬆兩次。

db.verbs.aggregate([ 
    // match documents with specific verb 
    {$match: {verb: "comprare"}}, 
    // query each conjugation as a separate document 
    {$unwind: "$conjugations"}, 
    // match conjugations with the provided tense 
    {$match: {"conjugations.tense": "present"}}, 
    // query each form as a separate document 
    {$unwind: "$conjugations.forms"}, 
    // match conjugation form with the provided pronoun 
    {$match: {"conjugations.forms.pronoun": "io"}}, 
    // only select fields of interest 
    {$project: {"conjugations": 1, _id: 0}} 
]); 

可以改變投射得到具體領域,甚至重命名字段,並使用表達式:

{"conjugations.forms.pronoun": 1} 
-> {conjugations: {forms: {pronoun: "io"}}} 
{"conjugation": "$conjugations.forms.conjugation"} 
-> {conjugation: "compro"} 
+0

謝謝!這幾乎是我想要的。我如何才能讓它返回結合('「compro」')? – nachocab

+0

@nachocab更新了答案,並提供了更詳細的信息 –

+0

謝謝,第二個投影做到了! – nachocab