Mongodb: 在数组中查找和更新对象属性
Mongodb: 在数组中查找和更新对象属性
我有一个包含多个文档的集合,其结构如下:
{
"_id" : {
"oid" : XXX
},
"name" : "名称",
"videos" [
{
"id" : 1,
"thumbnail" : "缩略图.jpg",
"name" : "这里是名称"
},
{
"id" : 2,
"thumbnail" : "缩略图.jpg",
"name" : "这里是名称"
},
{
"id" : 3,
"thumbnail" : "缩略图.jpg",
"name" : "这里是名称"
}
]
}
我想要找到并更新一个视频的缩略图,我只知道其id,但不知道它在哪个文档中。
目前我尝试了以下方法,但它没有正常工作。我找到的所有示例都依赖于知道文档id和要更新的对象的数组位置。我还发现,像这样进行查询会找到文档,但会将整个文档设置为新的缩略图!
db.collection(COLLECTION-NAME, function(err, collection){ collection.update( { 'videos.id' : 2 }, { $set: { thumbnail: "新缩略图.jpg" } }, function(err, result){ if (!err){ console.log('保存成功', result) } else { console.log('错误', err); } } ); });
Mongodb: Finding and updating object property from array
在MongoDB中,当我们需要在数组中查找和更新对象属性时,可以使用$ positional operator(位置操作符)。下面是一个使用该操作符的例子,用于更新具有id为2的嵌套文档中的thumbnail字段的值:
db.collection.update( { "videos.id": 2 }, { "$set": { "videos.$.thumbnail" : "newThumbnail.jpg" } } )
这段代码的作用是在videos数组中查找id为2的对象,并更新该对象中的thumbnail字段的值为"newThumbnail.jpg"。
出现这个问题的原因是我们需要在数组中查找和更新具体的对象属性,而MongoDB的更新操作默认只会更新匹配到的第一个文档。因此,如果我们直接使用普通的更新操作,可能无法准确地找到并更新目标对象。
为了解决这个问题,我们可以使用$ positional operator来定位并更新数组中的特定对象属性。该操作符使用了占位符$,表示操作符应该在匹配到的第一个文档中执行更新操作。
在上述例子中,我们使用了videos.$.thumbnail来指定要更新的目标属性。其中,$表示匹配到的第一个文档,而thumbnail表示要更新的属性字段。
通过使用$ positional operator,我们可以准确地找到并更新数组中的特定对象属性,而不会影响其他文档的属性。这是一种非常方便和灵活的更新方式,可以满足我们在实际开发中对于数组对象属性更新的需求。