将新字段添加到MongoDB中集合的object类型数组中
请参见下面的示例(来自mongochef的json格式)。我需要为集合中的每个元素添加一个名为isReadOnly(bool)的新字段。我该怎么做?我可以很容易地将它添加到文档的根目录中,但要在每个数组元素中完成这项工作却很困难将新字段添加到MongoDB中集合的object类型数组中,mongodb,nosql,Mongodb,Nosql,请参见下面的示例(来自mongochef的json格式)。我需要为集合中的每个元素添加一个名为isReadOnly(bool)的新字段。我该怎么做?我可以很容易地将它添加到文档的根目录中,但要在每个数组元素中完成这项工作却很困难 { "_id" : "fda42f22-0fa4-4e4a-94bf-245b1124c8b9", "_t" : "FullConfiguration", "DeviceConfigName" : "Illinois", "Elements" : [ {
{
"_id" : "fda42f22-0fa4-4e4a-94bf-245b1124c8b9",
"_t" : "FullConfiguration",
"DeviceConfigName" : "Illinois",
"Elements" : [
{
"_t" : "NumberConfigurationElement",
"AsciiConfigNumber" : NumberInt(10),
"DataType" : NumberInt(1),
"ByteOffset" : NumberInt(0),
"Name" : "alcohol_limit",
"Description" : "The alcohol limit of the device (ug/l)",
"AckResponse" : "HT-CONFG,010,00119",
"DevicePart" : NumberInt(1),
"Value" : NumberInt(119),
"DefaultValue" : NumberInt(119),
"Min" : NumberInt(50),
"Max" : NumberInt(500)
}, .....
您可以这样做(如果您的集合称为“coll”):
您可以这样做(如果您的集合称为“coll”):
@Styvane,这就是我想到的,它看起来还是有点粗糙
var query = {
Elements: {
$elemMatch: {
_t: { $exists: true },
isReadOnly: { $exists: false }
}
}
};
while (db.collection.find(query).count() > 0) {
db.collection.update(
query,
{ $set: { "Elements.$.isReadOnly": true } }
);
}
@Styvane,这就是我想到的,它看起来还是有点粗糙
var query = {
Elements: {
$elemMatch: {
_t: { $exists: true },
isReadOnly: { $exists: false }
}
}
};
while (db.collection.find(query).count() > 0) {
db.collection.update(
query,
{ $set: { "Elements.$.isReadOnly": true } }
);
}
@David我已经找到了MongoDB 3.6+的工作解决方案
db.collection.update({},
{ $set: { "Elements.$[].isReadOnly": false } }, { multi: true }
)
此命令将在文档的所有元素数组字段中添加isReadOnly=false
字段
$position
修饰符指定数组中$push
操作符插入元素的位置。如果不使用$position
修饰符,则$push
操作符会将元素插入数组的末尾。有关更多信息,请参见$push
修改器
您可以在@David上找到更多详细信息,我已经找到了MongoDB 3.6+的工作解决方案
db.collection.update({},
{ $set: { "Elements.$[].isReadOnly": false } }, { multi: true }
)
此命令将在文档的所有元素数组字段中添加isReadOnly=false
字段
$position
修饰符指定数组中$push
操作符插入元素的位置。如果不使用$position
修饰符,则$push
操作符会将元素插入数组的末尾。有关更多信息,请参见$push
修改器
您可以在上找到更多详细信息,这会将另一个{isReadOnly:false}
文档推送到现有元素数组中,而不是推送到数组中的每个文档中。MongoDB JIRA上有一个公开的问题,我认为唯一的方法是在JavaScript内部使用Mongoose或其他MongoDB驱动程序。@dyouberg有更好的方法可以做到这一点,您可能不想像答案中所示那样迭代光标,因为存在竞争条件的可能性,记住Murphy定律这会推送一个{isReadOnly:false}
到现有的元素数组,而不是数组中的每个文档。MongoDB JIRA对此存在一个公开问题,我认为唯一的方法是在JavaScript内部使用Mongoose或其他MongoDB驱动程序。@dyouberg有更好的方法来做到这一点,您可能不想像ans中所示那样迭代光标wer因为存在竞争条件的可能性,记住Murphy定律这也不好。这在MongoDB 2.4中事实上是正确的,即使这样,你也可以只迭代光标,而不是curor。最好的方法是使用它也不好。这在MongoDB 2.4中事实上是正确的,即使这样,你也可以迭代e光标,而不是curor。最好的方法是使用