收集_id在mongoimport之后没有破折号?

时间:2013-01-29 03:05:16

标签: mongodb meteor mongoimport

所以,我遇到了一个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格式,我真的很感激!

2 个答案:

答案 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。