2

我收集了许多文件。我想删除所有文档中的特殊字符。

我的文档如下图所示。所有名称 apple 、 orange 和banana 的值都有句点。

{
  "_id" : ObjectId("54fdfdfdf54fdfg5474"),
  "someField" : "something",
  "SomeString" : "something",
  "SomeMoreSting" : "SomeMore",
  "fields" : [{
      "name" : "apple",
      "value" : ".200"
    }, {
      "name" : "orange",
      "value" : "431736.78"
    }, {
      "name" : "banana",
      "value" : "20.25"
    }]
}

执行更新查询后,我希望文档如下所示。这里在苹果和橙子的值字段中删除了句点。但是香蕉的期间没有被删除。我想为特定字段值删除它,但不是为所有文档的此集合中的所有字段值。请让我知道如何实现这一目标。

{
  "_id" : ObjectId("54fdfdfdf54fdfg5474"),
  "someField" : "something",
  "SomeString" : "something",
  "SomeMoreSting" : "SomeMore",
  "fields" : [{
      "name" : "apple",
      "value" : "200"
    }, {
      "name" : "orange",
      "value" : "43173678"
    }, {
      "name" : "banana",
      "value" : "20.25"
    }]
}
4

2 回答 2

2

您可以使用聚合管道来实现这一点。例如:

db.collection.aggregate([{
    $match: {

    }
}, {
    $project: {
        fields: {
            $map: {
                input: "$fields",
                as: "field",
                "in": {
                    $cond: {
                        "if": {
                            $in: ["$$field.name", ["apple", "orange"]]
                        },
                        then: {
                            name: "$$field.name",
                            value: {
                                $concat: [{
                                    $arrayElemAt: [{
                                        $split: ["$$field.value", "."]
                                    }, 0]
                                }, {
                                    $arrayElemAt: [{
                                        $split: ["$$field.value", "."]
                                    }, 1]
                                }]
                            }
                        },
                        "else": "$$field"
                    }
                }
            }
        }
    }
}, {
    $out: "collection2"
}])

这假设在 中总是有一个且只有一个.fields.value如果您的真实数据更复杂,我建议使用例如 Mongo Shell、pymongo 来执行此操作,例如请参阅如何替换 mongodb 文档中的子字符串

于 2019-12-03T07:28:06.087 回答
1

这是以下答案中提到的基于 JavaScript 的方法

StackOverFlow 问题 - 如何在 mongodb 中更新多个数组元素

答案之一 - https://stackoverflow.com/a/20601288/3704501

删除第一个点

db.fruits.find({}).forEach(function (doc) {
    doc.fields.forEach(function (field) {
      if ((field.name === "apple" || field.name === "orange") && field.value.match("^[.]")) {
        field.value=field.value.substr(1,field.value.length);
      }
    });
    db.fruits.save(doc);
  });

删除字符串中任意位置的点

db.fruits.find({}).forEach(function (doc) {
    doc.fields.forEach(function (field) {
      if ((field.name === "apple" || field.name === "orange") && field.value.match("[.]")) {
        field.value=field.value.replace(".","");
      }
    });
    db.fruits.save(doc);
  });

我在 mongodb 版本 3.6.13 中试过这个

于 2019-12-03T10:00:40.813 回答