MongoDB文档中的重构名称
在我当前的mongo集合中,我的对象存储为MongoDB文档中的重构名称,mongodb,Mongodb,在我当前的mongo集合中,我的对象存储为 { _id: '....', name: 'Thomas Jefferson', date: '12/1/2016' } { _id: '....', name: 'FRANKLIN, BENJAMIN', date: '12/1/2016' } 有些是存储的,例如 { _id: '....', name: 'Thomas Jefferson', date: '12/1/201
{
_id: '....',
name: 'Thomas Jefferson',
date: '12/1/2016'
}
{
_id: '....',
name: 'FRANKLIN, BENJAMIN',
date: '12/1/2016'
}
有些是存储的,例如
{
_id: '....',
name: 'Thomas Jefferson',
date: '12/1/2016'
}
{
_id: '....',
name: 'FRANKLIN, BENJAMIN',
date: '12/1/2016'
}
但现在我必须重写/重构我的文档,使它们具有相同的格式
{
_id: '....',
name: {
first: 'BENJAMIN',
last: 'FRANKLIN'
},
date: '12/1/2016'
},
{
_id: '....',
name: {
first: 'Thomas',
last: 'Jefferson'
},
date: '12/1/2016'
}
我知道没有一个命令可以完成这两种情况,但是有一个命令可以完成LASTNAME和FIRSTNAME的情况吗?您可以使用shell中的
find().foreach
来完成
之前
db.users.find().pretty()
{
"_id" : ObjectId("58ffc291055ee5ec5334d97b"),
"name" : "FRANKLIN, BENJAMIN",
"date" : "12/1/2016"
}
{
"_id" : ObjectId("58ffc298055ee5ec5334d97c"),
"name" : "Thomas Jefferson",
"date" : "12/1/2016"
}
查询
// {name: {$type: 'string'}} will filter on records with name of type string
db.users.find({name: {$type: 'string'}}).forEach(function(item) {
if (item.name) {
var lastname = item.name.split(' ')[0].replace(',', '');
var firstname = item.name.split(' ')[1];
db.users.update(
{_id: item._id},
{$set: {lastname: lastname, firstname: firstname}}
)
}
})
之后
db.users.find().pretty()
{
"_id" : ObjectId("58ffc291055ee5ec5334d97b"),
"name" : "FRANKLIN, BENJAMIN",
"date" : "12/1/2016",
"lastname" : "FRANKLIN",
"firstname" : "BENJAMIN"
}
{
"_id" : ObjectId("58ffc298055ee5ec5334d97c"),
"name" : "Thomas Jefferson",
"date" : "12/1/2016",
"lastname" : "Thomas",
"firstname" : "Jefferson"
}
您可以使用shell中的
find().foreach
执行此操作
之前
db.users.find().pretty()
{
"_id" : ObjectId("58ffc291055ee5ec5334d97b"),
"name" : "FRANKLIN, BENJAMIN",
"date" : "12/1/2016"
}
{
"_id" : ObjectId("58ffc298055ee5ec5334d97c"),
"name" : "Thomas Jefferson",
"date" : "12/1/2016"
}
查询
// {name: {$type: 'string'}} will filter on records with name of type string
db.users.find({name: {$type: 'string'}}).forEach(function(item) {
if (item.name) {
var lastname = item.name.split(' ')[0].replace(',', '');
var firstname = item.name.split(' ')[1];
db.users.update(
{_id: item._id},
{$set: {lastname: lastname, firstname: firstname}}
)
}
})
之后
db.users.find().pretty()
{
"_id" : ObjectId("58ffc291055ee5ec5334d97b"),
"name" : "FRANKLIN, BENJAMIN",
"date" : "12/1/2016",
"lastname" : "FRANKLIN",
"firstname" : "BENJAMIN"
}
{
"_id" : ObjectId("58ffc298055ee5ec5334d97c"),
"name" : "Thomas Jefferson",
"date" : "12/1/2016",
"lastname" : "Thomas",
"firstname" : "Jefferson"
}
item.name.split不是一个函数
,mongodb v3.2.6我刚刚在3.2.6 mongo上试用过,应该可以用,我想你有name:null的记录
。我用一个guard子句更新了查询,以保护您不受这种特殊情况的影响。没有…没有我有空名称的实例。下面是错误:2017-04-25T14:58:15.472-0700 E查询[thread1]类型错误:item.name.split不是函数:@(shell):1:83 DBQuery.prototype。forEach@src/mongo/shell/query.js:488:1@(shell):1:1@gh0st:您的name属性总是字符串吗?是,但是有什么方法可以让我再次检查吗?item.name.split不是一个函数
,mongodb v3.2.6我刚刚在3.2.6 mongo上试用过,它应该可以工作,我想你有name:null
的记录。我用一个guard子句更新了查询,以保护您不受这种特殊情况的影响。没有…没有我有空名称的实例。下面是错误:2017-04-25T14:58:15.472-0700 E查询[thread1]类型错误:item.name.split不是函数:@(shell):1:83 DBQuery.prototype。forEach@src/mongo/shell/query.js:488:1@(shell):1:1@gh0st:您的name属性总是一个字符串吗?是的,但是有什么方法可以让我重复检查吗?