如何从MongoDB中的逗号分隔字符串字段创建一个对象数组?

发布于 2025-02-07 01:38:05 字数 1394 浏览 1 评论 0原文

我有三个看起来像这样的文档:

_id: ObjectId('61e1312ad435c7124aa883a1')
name: "Brian"
languages: "English,Spanish,French"

_id: ObjectId('52e1312ad435c7124aa883a2')
name: "Max"
languages: "English"

_id: ObjectId('37e1312ad435c7124aa883a9')
name: "Mike"
languages: ""

如您所见,语言字段可以是空的,有一个项目,也可以用逗号分隔的多个项目。

我想创建一个新字段,即一系列对象。每个对象都应由“名称”属性和“主动”布尔值组成。 “名称”应该是语言,“主动”应该只是设置为false。最终结果应该看起来像这样:

_id: ObjectId('61e1312ad435c7124aa883a1')
name: "Brian"
languages: "English,Spanish,French"
newLanguages: [
    { name: "English", active: false },
    { name: "Spanish", active: false },
    { name: "French", active: false }
]

_id: ObjectId('52e1312ad435c7124aa883a2')
name: "Max"
languages: "English,Spanish,French"
newLanguages: [
    { name: "English", active: false }
]

_id: ObjectId('37e1312ad435c7124aa883a9')
name: "Mike"
languages: ""
newLanguages: []

我已经设法将逗号分隔的字符串变成了我想要的对象,但是它并没有创建新属性,它只是覆盖了语言属性:

db.collection.updateMany({},
[
  {
    $set: {
      languages: {
        $filter: {
          input: {$split: ["$languages", ","]},
          cond: {$gt: [{$strLenCP: "$$this"}, 0]}
        }
      }
    }
  },
  {
    $set: {
      languages: {
        $map: {
          input: "$languages",
          as: "item",
          in: {name: "$$item", active: false}
        }
      }
    }
 }
])

I have three documents that looks like this:

_id: ObjectId('61e1312ad435c7124aa883a1')
name: "Brian"
languages: "English,Spanish,French"

_id: ObjectId('52e1312ad435c7124aa883a2')
name: "Max"
languages: "English"

_id: ObjectId('37e1312ad435c7124aa883a9')
name: "Mike"
languages: ""

As you can see, the languages field can either be empty, have one item, or multiple items separated by commas.

I want to create a new field, that is an Array of objects. Each object should consist of a "name" property and an "active" boolean. "name" should be the language and "active" should just be set to false. The end result should look like this:

_id: ObjectId('61e1312ad435c7124aa883a1')
name: "Brian"
languages: "English,Spanish,French"
newLanguages: [
    { name: "English", active: false },
    { name: "Spanish", active: false },
    { name: "French", active: false }
]

_id: ObjectId('52e1312ad435c7124aa883a2')
name: "Max"
languages: "English,Spanish,French"
newLanguages: [
    { name: "English", active: false }
]

_id: ObjectId('37e1312ad435c7124aa883a9')
name: "Mike"
languages: ""
newLanguages: []

I've managed to turn the comma-separated strings into the objects I want, but it doesn't create a new property, it just overwrites the languages property:

db.collection.updateMany({},
[
  {
    $set: {
      languages: {
        $filter: {
          input: {$split: ["$languages", ","]},
          cond: {$gt: [{$strLenCP: "$this"}, 0]}
        }
      }
    }
  },
  {
    $set: {
      languages: {
        $map: {
          input: "$languages",
          as: "item",
          in: {name: "$item", active: false}
        }
      }
    }
 }
])

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夜夜流光相皎洁 2025-02-14 01:38:05

只需设置一个新的键newlanguages,而不是现有的键语言,它将保持原样:

db.collection.updateMany({},
[
  {
    $set: {
      newLanguages: {
        $filter: {
          input: {$split: ["$languages", ","]},
          cond: {$gt: [{$strLenCP: "$this"}, 0]}
        }
      }
    }
  },
  {
    $set: {
      newLanguages: {
        $map: {
          input: "$newLanguages",
          as: "item",
          in: {name: "$item", active: false}
        }
      }
    }
 }
])

查看其在游乐场示例

Simply set a new key newLanguages, instead of the existing key languages, which will stay as it was:

db.collection.updateMany({},
[
  {
    $set: {
      newLanguages: {
        $filter: {
          input: {$split: ["$languages", ","]},
          cond: {$gt: [{$strLenCP: "$this"}, 0]}
        }
      }
    }
  },
  {
    $set: {
      newLanguages: {
        $map: {
          input: "$newLanguages",
          as: "item",
          in: {name: "$item", active: false}
        }
      }
    }
 }
])

See how it works on the playground example

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文