我试图从数组的每个项目中删除一个对象,但保留对象和数组元素的其余部分。例如:
[
{
_id: 1,
analytics: [
{
date: ISODate("2017-09-10T14:00:00Z"),
country: { uk: 1, fr: 5, de: 15 },
browser: { ie: 2, ff: 5, ch: 14 }
},
{
date: ISODate("2017-09-10T14:00:00Z"),
country: { uk: 1, fr: 5, de: 15 },
browser: { ie: 2, ff: 5, ch: 14 }
},
]
},
{
_id: 2,
analytics: [
{
date: ISODate("2017-09-10T14:00:00Z"),
country: { uk: 5, fr: 1, de: 5 },
browser: { ie: 14, ff: 2, ch: 5 }
},
{
date: ISODate("2017-09-10T15:00:00Z"),
country: { uk: 5, fr: 1, de: 5 },
browser: { ie: 14, ff: 2, ch: 5 }
]
}
]
我想运行一个命令,它将从每个文档的每个数组成员中删除浏览器对象。结果看起来像
[
{
_id: 1,
analytics: [
{
date: ISODate("2017-09-10T14:00:00Z"),
country: { uk: 1, fr: 5, de: 15 }
},
{
date: ISODate("2017-09-10T14:00:00Z"),
country: { uk: 1, fr: 5, de: 15 }
},
]
},
{
_id: 2,
analytics: [
{
date: ISODate("2017-09-10T14:00:00Z"),
country: { uk: 5, fr: 1, de: 5 }
},
{
date: ISODate("2017-09-10T15:00:00Z"),
country: { uk: 5, fr: 1, de: 5 }
]
}
]
以下内容:
db.collection.update({}, { $pull: { analytics: { country: { $exists: true } } } }, { multi: true});
?
感谢
答案 0 :(得分:0)
Neil lunn是对的。您可以编写自己的脚本并循环遍历然后执行删除,而不是期望一个更新语句为您完成所有操作。
db.getCollection('yourcollection').find({"analytics.country" : {"$exists" : true}}).
forEach(function(item) {
item.analytics.forEach(function(analytic){
delete analytic.browser;
})
db.getCollection('yourcollection').save(item)
})