gpt4 book ai didi

mongodb - 将 Mongo 中的某些字段从字符串转换为数组

转载 作者:IT老高 更新时间:2023-10-28 12:31:26 28 4
gpt4 key购买 nike

我有一个文档集合,其中“标签”字段从空格分隔的标签列表切换到单个标签的数组。我想将以前的空格分隔字段更新为像新传入数据一样的数组。

我也遇到了 $type 选择器的问题,因为它将类型操作应用于单个数组元素,这些元素是字符串。所以按类型过滤只会返回所有内容。

如何将每个看起来像第一个示例的文档转换为第二个示例的格式?

{
"_id" : ObjectId("12345"),
"tags" : "red blue green white"
}
{
"_id" : ObjectId("54321"),
"tags" : [
"red",
"orange",
"black"
]
}

最佳答案

我们不能使用 $type运算符在此处过滤我们的文档,因为我们数组中元素的类型是“字符串”,并且如文档中所述:

When applied to arrays, $type matches any inner element that is of the specified BSON type. For example, when matching for $type : 'array', the document will match if the field has a nested array. It will not return results where the field itself is an array.

但幸运的是,MongoDB 还提供了 $exists 运算符,可以在此处与数字数组索引一起使用。

现在我们如何更新这些文档?

嗯,从 MongoDB 版本 <= 3.2 开始,我们唯一的选择是 mapReduce()但首先让我们看看即将发布的 MongoDB 中的另一个替代方案。

从 MongoDB 3.4 开始,我们可以 $project我们的文档并使用 $split 运算符将我们的字符串拆分为子字符串数组。

请注意,要仅拆分那些为字符串的“标签”,我们需要一个逻辑 $cond ition 处理以仅拆分字符串值。这里的条件是$eq当字段的 $type 等于 "string" 时,计算结果为 true。顺便说一下,这里的 $type 是 3.4 中的新内容。

最后我们可以使用 $out 覆盖旧集合管道阶段运算符(operator)。 但我们需要在 $project 阶段明确指定包含其他字段

db.collection.aggregate(
[
{ "$project": {
"tags": {
"$cond": [
{ "$eq": [
{ "$type": "$tags" },
"string"
]},
{ "$split": [ "$tags", " " ] },
"$tags"
]
}
}},
{ "$out": "collection" }
]
)

使用 mapReduce,我们需要使用 Array.prototype.split()在我们的 map 函数中发出子字符串数组。我们还需要使用“查询”选项过滤我们的文档。从那里我们需要使用 bulkWrite() 使用批量操作迭代 "results"数组和 $set "tags"的新值。 3.2 中的新方法或现已弃用的 Bulk()如果我们使用 2.6 或 3.0,如图所示 here.

db.collection.mapReduce(
function() { emit(this._id, this.tags.split(" ")); },
function(key, value) {},
{
"out": { "inline": 1 },
"query": {
"tags.0": { "$exists": false },
"tags": { "$type": 2 }
}
}
)['results']

关于mongodb - 将 Mongo 中的某些字段从字符串转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39049971/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com