2014-09-23 49 views
0

我有以下模式如何在Mongoose或MongoDB中編寫更新查詢?

var myschema = new schema({ 
      username: { type: String, required: validationMessages.required, index: { unique: true }, lowercase: true },    
      siteConfig:{ type: Array} 
     }); 

我的文件將是這個樣子

{ 
"_id" : ObjectId("5411a6fb4bcc787927825dac"), 
"username" : "admin" 
    "siteConfig" : [ 
    { 
     "name" : "landing" 
     "page" : { 
      "name" : "home",        
      "sections" : [ 
       { 
        "name" : "header", 
       }, 
       { 
        "name" : "bodycontent", 
       }, 

       { 
        "name" : "footer", 
       } 
      ] 
     } 
    } 

}

我想更新屬性「名」:在」頭」siteConfig-> page-> sections WHERE標準匹配如下

(「用戶名」:」管理」 & &‘siteConfig.name’:‘落地‘& &‘page.name’:’家’)

我已經trired用點符號和elematch,但我不不知道寫更新查詢的正確方法。

+1

您需要閱讀[位置'$'](http://docs.mongodb.org/manual/reference/operator/update/positional/)運算符的文檔。而基本上告訴你的是,無論你的查詢條件如何,只有** fisrt **和「outer」數組元素纔會匹配。因此,如果您打算「更新」嵌入在另一個陣列中的嵌入式陣列的成員,那麼您需要重新考慮您的結構。除非在發佈更新時始終「知道」內部數組的位置,否則這將不起作用。 – 2014-09-23 10:24:27

+0

對,我可以通過以下查詢進行更新(db.schema.update({username:「admin」,siteConfig:{$ elemMatch:{name:「landing」}}},{$ set:{「siteConfig.0 .page.sections。$。name「:」demo「}}))但是我需要檢查一個更多的條件是如果」Section。$。name「=」header「然後更新'section。$。name':」演示「 – 2014-09-23 13:58:53

回答

1

我認爲問題可能是您尚未定義siteConfig的架構。首先,更新的模式是這樣的:

var ObjSchema = new Schema({ 
    ... 
    siteConfig: [ 
     { 
      name: {type: String}, 
      page: { 
       name: {type: String}, 
       sections: [ 
        { 
         name: {type: String}, 
        } 
       ], 
      }, 
     } 
    ], 
}); 

現在你可以這樣更新:

var query = { 
    username: 'admin', 
    'siteConfig.name': 'landing', 
    'siteConfig.page.name': 'home', 
}; 
var update = { 
    $set: { 
     'siteConfig.page.sections.0.name': 'header', 
    }, 
}; 
var options = { 
    multi: true, 
}; 

Obj.update(query, update, options, function(err, numAffected) { 
    ... 
}); 

我不知道你想更新,所以你可以改變update字典你想怎麼什麼。如果您不想更新多個文檔,請更改options字典。

+0

好吧,我會添加架構並檢查,然後讓你知道。是否有任何方法來檢查另一個條件,如「siteConfig.page.sections.0.name =」標題「然後我將更新此屬性? – 2014-09-24 08:40:47

+0

@DharmalingamArumugam酷,讓我知道它是怎麼回事。 – 2014-09-24 14:47:10

+0

謝謝,並對不起你是對的,我們必須定義上面定義的架構中'siteConfig'的每個屬性,以便找到或更新嵌套對象,並且不確定我是否已經嘗試了上面的內容(所以我會再試一次並更新你狀態),但我記得我已經定義了siteConfig的每個屬性,但沒有得到預期的東西移動到find()等其他解決方案,然後手動修改,然後save()。 – 2015-01-21 08:33:52

相關問題