MongoDB文档中的重构名称

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

在我当前的mongo集合中,我的对象存储为

{
    _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属性总是一个字符串吗?是的,但是有什么方法可以让我重复检查吗?