在多个字段上设置相同的值
Set same value on multiple fields
我有以下文档结构:
{
...
timings: {
mon: "",
tue: "",
wed: "",
thu: "",
fri: "",
sat: "",
sun: "",
}
...
}
我想为一周中的所有日子设置值 "Open 24 Hours"。
目前我正在使用查询:
db.collection.update({_id: ObjectId("someId")}, {$set: {"timings.mon": "Open 24 Hours"}});
然后 运行在一周的其余日子里同样如此。
我也可以显式设置同一个查询中的所有字段,但只需更改日期并再次 运行 会更快。
有没有办法更有效地设置子文档中多个字段的值?
更新
我尝试了以下查询,但它不起作用:
db.collection.update({_id: ObjectId("someId")}, {$set: {"timings.$": "Open 24 Hours"}});
您可以先尝试创建更新对象,您可以在其中设置该对象的多个字段,然后再以这种方式更新文档:
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);
使用 db.collection.findOne(query)
查询该文档的集合将产生:
/* 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"
}
}
-- 更新 --
另一种方法(正如@Michael 在评论中所建议的那样)是使用 JavaScript 的原生 Object.keys()
方法,该方法 returns 给定对象自身的可枚举属性的数组, 与 for...in 循环提供的顺序相同(区别在于 for-in 循环也枚举原型链中的属性):
> var days = Object.keys(db.collection.findOne().timings);
> print(days);
mon,tue,wed,thu,fri,sat,sun
>
因此可以实现为:
var days = Object.keys(db.collection.findOne().timings),
timings = {},
query = {"_id" : ObjectId("554e12e4674dec7517e692eb")},
update = {
"$set": { "timings": timings }
},
options = {"upsert": true};
我有以下文档结构:
{
...
timings: {
mon: "",
tue: "",
wed: "",
thu: "",
fri: "",
sat: "",
sun: "",
}
...
}
我想为一周中的所有日子设置值 "Open 24 Hours"。
目前我正在使用查询:
db.collection.update({_id: ObjectId("someId")}, {$set: {"timings.mon": "Open 24 Hours"}});
然后 运行在一周的其余日子里同样如此。
我也可以显式设置同一个查询中的所有字段,但只需更改日期并再次 运行 会更快。
有没有办法更有效地设置子文档中多个字段的值?
更新
我尝试了以下查询,但它不起作用:
db.collection.update({_id: ObjectId("someId")}, {$set: {"timings.$": "Open 24 Hours"}});
您可以先尝试创建更新对象,您可以在其中设置该对象的多个字段,然后再以这种方式更新文档:
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);
使用 db.collection.findOne(query)
查询该文档的集合将产生:
/* 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"
}
}
-- 更新 --
另一种方法(正如@Michael 在评论中所建议的那样)是使用 JavaScript 的原生 Object.keys()
方法,该方法 returns 给定对象自身的可枚举属性的数组, 与 for...in 循环提供的顺序相同(区别在于 for-in 循环也枚举原型链中的属性):
> var days = Object.keys(db.collection.findOne().timings);
> print(days);
mon,tue,wed,thu,fri,sat,sun
>
因此可以实现为:
var days = Object.keys(db.collection.findOne().timings),
timings = {},
query = {"_id" : ObjectId("554e12e4674dec7517e692eb")},
update = {
"$set": { "timings": timings }
},
options = {"upsert": true};