所以,我遇到了一个SQL到Mongo数据迁移的问题。我们使用我们的SQL数据库并将其展平为单个数据数组,具有基本数组结构,如下所示:
[
{
'assettype' : 'image',
'title' : 'Cat',
},
{
'assettype' : 'image',
'title' : 'Dog',
},
{
'assettype' : 'image',
'title' : 'Bird',
}
]
非常简单,非常直截了当。一旦我们以数组形式获得它,我们将它导入我们的mongo实例,如下所示。
mongoimport -d staging -c assets < library_assets.json --jsonArray
再次,非常简单。非常直截了当。乍一看,似乎一切都按预期工作。但是,仔细观察后发现,资产集合中所有记录的MongoIds都没有破折号!也就是说,所有mongo id都采用以下格式:
51073797074f0d6db8e3149a
而不是预期的格式:
c6689c53-a05c-4e94-b503-ac61558cc0c6
除了依赖MongoId的查询外,一切正常。因此,例如,这将起作用:
db.assets.find();
但这不会:
db.assets.findOne({"_id": 51073797074f0d6db8e3149a });
我一直在倾注文档和咕噜声,但我找不到任何东西。如果有人能指出我正确的方向并帮助导入这个文件,所以它有正确的MongoId格式,我真的很感激!
答案 0 :(得分:3)
我不确定你为什么期望_id
字段中的破折号 - 如果它们是由Mongo自动生成的(即你的导入中没有_id
字段),他们会看起来像4f5fbb91a717b0f8d080e9d7
。因此,您所看到的是没有用户定义的_id
字段导入成功的完全正常结果。
也就是说,_id
在自动生成时是ObjectId
而不是String
的实例。此查询将起作用:
db.assets.findOne({"_id": new ObjectId("51073797074f0d6db8e3149a")})
答案 1 :(得分:1)
因此,在深入探讨这个问题之后,事实证明龙虾1234完全正确。而且,这是Meteor框架的一个已知错误。
https://github.com/meteor/meteor/issues/61
解决方法是返回到原始数据集,该数据集包含来自旧系统的一些声明,如下所示:
[
{
'assetid' : '123456789a',
'assettype' : 'image',
'title' : 'Cat',
},
{
'assetid' : '123456789b',
'assettype' : 'image',
'title' : 'Dog',
},
{
'assetid' : '123456789c',
'assettype' : 'image',
'title' : 'Bird',
}
]
要对'_id'进行简单的搜索和替换'assetid',所以数据集如下:
[
{
'_id' : '123456789a',
'assettype' : 'image',
'title' : 'Cat',
},
{
'_id' : '123456789b',
'assettype' : 'image',
'title' : 'Dog',
},
{
'_id' : '123456789c',
'assettype' : 'image',
'title' : 'Bird',
}
]
运行mongoimport后,_id字段用数据集中的字符串填充,而不是MongoDB生成唯一的ObjectIds。