我有一个看起来像这样的集合:
{
_id: ...,
checkins: [
{
id: ...,
createdAt: 1488052032,
...
},
{
id: ...,
createdAt: 1488052032,
...
}
]
}
我想在 id 和 createdAt 属性(checkins,一个对象数组)旁边添加一个名为created
的新元素。我想为没有这个新元素的所有元素做这件事。
我知道如何检查一个对象是否已经有一个属性,但是我在添加元素时遇到了一些问题。我正在使用下面的代码并返回一个错误说:位置运算符未找到查询所需的匹配。
db.profiles.updateMany(
{},
{$set: {"checkins.$.created": new Date(0)}}
)
关于我做错了什么的任何想法?
答案 0 :(得分:2)
由于无法更新多个数组子文档(检查this post),您可以匹配至少一个没有created
字段的子文档的所有文档,然后逐个更新必须更新的子文档:
db.profiles.find({
"checkins": {
"$elemMatch": { "created": { "$exists": false } }
}
}).forEach(function(doc) {
doc.checkins.filter(function(event) {
return !('created' in event)
}).forEach(function(event) {
db.profiles.update({
"_id": doc._id,
"checkins": {
"$elemMatch": { "created": { "$exists": false } }
}
}, {
$set: {
"checkins.$.created": new Date(0)
}
});
});
});
请注意elemMatch
与exists
一起使用,用于检查字段是否存在。这应该使用updateMany
请求修复您的初始错误消息(但您的初始请求不会更新所有数组元素)