如何在Mongo shell中从JSON对象的属性列表中删除属性?
如何在Mongo shell中从JSON对象的属性列表中删除属性?
我在MongoDB(2.4.5)中有以下文档:
{
"_id" : 235399,
"casts" : {
"crew" : [
{
"_id" : 1186343,
"withBase" : true,
"department" : "Directing",
"job" : "Director",
"name" : "Connie Rasinski"
},
{
"_id" : 86342,
"withBase" : true
}
]
},
"likes" : 0,
"rating" : 0,
"rating_count" : 0,
"release_date" : "1955-11-11"
}
我想从casts.crew中的数组元素中删除withBase字段...
我尝试了以下操作:
db.coll.update({_id:235399},{$unset: { "casts.crew.withBase" : 1 } },false,true)
但没有任何变化。
我还尝试了以下操作:
db.coll.update({_id:235399},{$unset: { "casts.crew" : { $elemMatch: { "withBase": 1 } } } },false,true)
它从文档中删除了整个crew数组。
请问有人可以提供正确的查询吗?
问题的出现主要是因为在Mongo shell中,使用$unset操作符无法直接从数组中删除一个属性。在给出的回答中,用户尝试使用了$unset操作符,但实际上它无法工作于数组,只能删除数组中的整个文档。此外,由于位置操作符的工作方式,该操作也只会从子文档的第一个出现位置删除属性的值。
因此,解决方法是使用$find和$forEach结合save来实现。具体操作如下:
db.coll.find({_id:235399}).forEach(function(doc) { var arr = doc.casts.crew; var length = arr.length; for (var i = 0; i < length; i++) { delete arr[i]["withBase"]; } db.coll.save(doc); });
这段代码会遍历集合中_id为235399的文档,然后通过循环遍历数组中的每个子文档,删除其中的withBase属性,并保存文档。这样就可以实现从数组的所有子文档中删除指定属性的值。
需要注意的是,这种方法并不是事务性的保存,即在find()和save()之间发生的任何更改都会被覆盖。如果使用MongoDB 3.6+版本,可以参考Veeram的解决方案来实现更好的事务性保存。
希望以上内容能够帮助解决问题。
如何从Mongo Shell中的JSON对象列表中删除属性?
问题的原因是,用户想要从Mongo Shell中的JSON对象列表中删除属性。用户提供了MongoDB版本为3.6及以上的代码示例,使用了新的位置标识符`$[]`来更新数组中的多个元素。代码示例中使用了`$unset`操作符来删除`casts.crew`数组中的所有`withBase`属性。
解决方法是使用MongoDB版本为3.6及以上的`$unset`操作符和位置标识符`$[]`。位置标识符`$[]`用作占位符,用于更新数组中的所有元素。使用`db.coll.update()`方法,并将查询条件作为第一个参数,更新操作作为第二个参数传递给方法。在更新操作中,使用`$unset`操作符来删除目标属性。将`$[]`用作位置标识符,以便更新数组中的所有元素。
如果需要影响多个文档,可以使用`multi: true`选项。此选项将更新操作应用于查询条件匹配的所有文档。
以下是用户提供的代码示例:
db.coll.update({_id: 235399}, {$unset: {"casts.crew.$[].withBase": ""}})
此代码将删除`casts.crew`数组中的所有`withBase`属性。
请注意,此方法仅适用于MongoDB版本为3.6及以上。如果MongoDB版本低于3.6,则无法使用位置标识符`$[]`。
用户还提供了其他一些相关信息和代码示例,但与问题的解决方法无关。