如何从MongoDB中的逗号分隔字符串字段创建一个对象数组?
我有三个看起来像这样的文档:
_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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
只需设置一个新的键
newlanguages
,而不是现有的键语言
,它将保持原样:查看其在游乐场示例
Simply set a new key
newLanguages
, instead of the existing keylanguages
, which will stay as it was:See how it works on the playground example