2015-05-09 58 views
2

我有以下的文檔結構:設置相同的值

{ 
    ... 
    timings: { 
     mon: "", 
     tue: "", 
     wed: "", 
     thu: "", 
     fri: "", 
     sat: "", 
     sun: "", 
    } 
    ... 
} 

我想設置的值「24小時開放」的一週中的每一天。

目前我使用的查詢:

db.collection.update({_id: ObjectId("someId")}, {$set: {"timings.mon": "Open 24 Hours"}}); 

然後運行的一週中的幾天,其餘相同。

我也可以明確地設置同一個查詢中的所有字段,但是更改日期並再次運行它會更快。

有沒有辦法以更有效的方式設置子文檔中多個字段的值?

UPDATE

我嘗試下面的查詢,但它不工作:

db.collection.update({_id: ObjectId("someId")}, {$set: {"timings.$": "Open 24 Hours"}}); 

回答

4

你可以嘗試先建立更新的對象,您可以在之前設置該對象的多個領域更新文件是這樣的:

var days = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"], 
    timings = {}, 
    query = {"_id" : ObjectId("554e12e4674dec7517e692eb")}, 
    update = { 
     "$set": { "timings": timings } 
    }, 
    options = {"upsert": true}; 

days.forEach(function (day){ timings[day] = "Open 24 Hours" }); 
db.collection.update(query, update, options); 

查詢使用該文檔集合將產生:

/* 0 */ 
{ 
    "_id" : ObjectId("554e12e4674dec7517e692eb"), 
    "timings" : { 
     "mon" : "Open 24 Hours", 
     "tue" : "Open 24 Hours", 
     "wed" : "Open 24 Hours", 
     "thu" : "Open 24 Hours", 
     "fri" : "Open 24 Hours", 
     "sat" : "Open 24 Hours", 
     "sun" : "Open 24 Hours" 
    } 
} 

- UPDATE -

的另一種方法(如由@邁克爾評價建議的)是使用JavaScript的天然Object.keys()方法,它返回一個給定的對象的陣列自己的枚舉的屬性,在相同的順序,通過提供一種用於... in循環(不同之處在於一個用於-in循環枚舉原型鏈性質以及):

> var days = Object.keys(db.collection.findOne().timings); 
> print(days); 
mon,tue,wed,thu,fri,sat,sun 
> 

和Th我們可以實現爲:

var days = Object.keys(db.collection.findOne().timings), 
    timings = {}, 
    query = {"_id" : ObjectId("554e12e4674dec7517e692eb")}, 
    update = { 
     "$set": { "timings": timings } 
    }, 
    options = {"upsert": true}; 
+2

而不是創建'days'陣列手動你可以做'Object.keys(db.collection.findOne()時序)' – styvane

+0

@邁克爾你是對的,這是一個優雅辦法。上面的方法考慮了選擇性更新,操作系統可能想要更新某些屬性,以便「days」數組可以相應地進行調整。 – chridam

+0

@chridam所有這些都可以在shell本身完成? – ZeMoon

相關問題