如何在Mongo shell中从JSON对象的属性列表中删除属性?

6 浏览
0 Comments

如何在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数组。

请问有人可以提供正确的查询吗?

0
0 Comments

问题的原因是在Mongo Shell中,如何从JSON对象的列表中删除属性。解决方法是使用update操作和$unset操作符来删除属性。具体的解决方法是通过在update操作中使用$unset操作符来删除属性,然后在$unset操作符的参数中指定要删除的属性的路径。如果要删除多个属性,则需要在参数中添加多个属性路径。在这个例子中,通过计算每个文档列表中可能包含的对象的数量,并将这些数字显式地添加到参数中。另外,要计算MongoDB对象中最长的数组,可以使用aggregate操作来实现。这种解决方法不是很优雅,但比获取和保存数据的方法要快得多。

0
0 Comments

问题的出现主要是因为在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的解决方案来实现更好的事务性保存。

希望以上内容能够帮助解决问题。

0
0 Comments

如何从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,则无法使用位置标识符`$[]`。

用户还提供了其他一些相关信息和代码示例,但与问题的解决方法无关。

0