1

所以,我遇到了从 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 格式,我将不胜感激!

4

2 回答 2

3

我不确定您为什么期望_id字段中出现破折号 - 如果它们是由 Mongo 自动生成的(即您的导入中没有_id字段),它们看起来像4f5fbb91a717b0f8d080e9d7. 因此,您所看到的完全是成功导入的正常结果,没有用户定义的_id字段。

也就是说_id,当自动生成时,它是一个实例,ObjectId而不是一个String. 此查询将起作用:

db.assets.findOne({"_id": new ObjectId("51073797074f0d6db8e3149a")})

于 2013-01-29T03:14:21.447 回答
1

所以,在深入研究这个问题之后,事实证明 lobster1234 是完全正确的。此外,这是 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',
  }
]

并做一个简单的“assetid”搜索和替换为“_id”,所以数据集如下:

[
  {
    '_id' : '123456789a',
    'assettype' : 'image',
    'title' : 'Cat',
  },
  {
    '_id' : '123456789b',
    'assettype' : 'image',
    'title' : 'Dog',
  },
  {
    '_id' : '123456789c',
    'assettype' : 'image',
    'title' : 'Bird',
  }
]

运行 mongoimport 后,_id 字段由数据集中的字符串填充,而不是 MongoDB 生成唯一的 ObjectId。

于 2013-01-29T16:05:34.840 回答