Mongodb更新:向集合数组的每个元素添加一个字段
标题第一次有点难理解,所以这里有一个例子。我使用mongodb,数据如下:Mongodb更新:向集合数组的每个元素添加一个字段,mongodb,Mongodb,标题第一次有点难理解,所以这里有一个例子。我使用mongodb,数据如下: id: String timestamp: String steps: [{ action: 1, timestamp: String }, { action: 2, timestamp: String }, ... ] 我想为每个步骤添加一个新字段,假设bot:false。 我尝试了如下更新: { $set: { 'steps': { 'bot': false } } } 然而,这取代了整个步骤,丢
id: String
timestamp: String
steps: [{
action: 1,
timestamp: String
}, {
action: 2,
timestamp: String
}, ...
]
我想为每个步骤添加一个新字段,假设bot:false。
我尝试了如下更新:
{ $set: { 'steps': { 'bot': false } } }
然而,这取代了整个步骤,丢失了操作/时间戳。
我还尝试:
{ $set: { 'steps.bot': false } }
这也不起作用,因为steps是一个数组
我还研究了$each修饰符,但是它似乎不适用于$set
有什么想法吗?
谢谢根据您的问题,我认为您的文档结构如下
{
"_id" : ObjectId("54996f980e64b1a2fcb4824e"),
"id" : "1",
"timestamp" : "Tue, 23 Dec 2014 13:37:33 GMT",
"steps" : [
{
"action" : 1,
"timestamp" : "Tue, 23 Dec 2014 13:37:40 GMT"
},
{
"action" : 2,
"timestamp" : "Tue, 23 Dec 2014 13:37:40GMT"
}
]
}
在上面的文档中,您希望添加新字段,如steps.bot:false,所以您应该使用以下javascript来更新嵌套文档
db.collectionName.find({
"steps":{"$exists":true}}).forEach(function(data){
for(var i=0;i<data.steps.length;i++) {
db.demo.update(
{
"_id": data._id,
"steps.action": data.steps[i].action
},
{
"$set": {
"steps.$.bob":
false
}
},true,true
);
}
})
根据你的问题,我认为你的文件结构如下
{
"_id" : ObjectId("54996f980e64b1a2fcb4824e"),
"id" : "1",
"timestamp" : "Tue, 23 Dec 2014 13:37:33 GMT",
"steps" : [
{
"action" : 1,
"timestamp" : "Tue, 23 Dec 2014 13:37:40 GMT"
},
{
"action" : 2,
"timestamp" : "Tue, 23 Dec 2014 13:37:40GMT"
}
]
}
在上面的文档中,您希望添加新字段,如steps.bot:false,所以您应该使用以下javascript来更新嵌套文档
db.collectionName.find({
"steps":{"$exists":true}}).forEach(function(data){
for(var i=0;i<data.steps.length;i++) {
db.demo.update(
{
"_id": data._id,
"steps.action": data.steps[i].action
},
{
"$set": {
"steps.$.bob":
false
}
},true,true
);
}
})
谢谢:正如我所想,它需要一点脚本。问题解决:谢谢:正如我所想,它需要一点脚本。解决的问题: