Конвертировать таблицу SQL в документ mongoDB - PullRequest
6 голосов
/ 07 декабря 2010

Как лучше всего преобразовать базу данных SQL, скажем, 1 таблицу, в документ mongoDB?

Полагаю, я мог бы использовать драйвер C # и реализовать цикл, который выбирает каждую строку в таблице и сохраняет ее в Mongo.

Ответы [ 5 ]

13 голосов
/ 14 июня 2011

Это скрипт импорта, который я использую для импорта данных с сервера SQL на Mongodb, расположенный на моем компьютере. Этот код просто создаст похожую таблицу (существующую в БД SQL) в MongoDB. Вы можете предоставить список таблиц для импорта через запятую, и все они будут импортированы без проблем.

static void Main(string[] args)
{
    List<string> tablelist = new List<string>();
    if (!args[0].Contains(','))
        tablelist.Add(args[0]);
    else
        tablelist.AddRange(args[0].Split(','));
    string sqlconnectionstring = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
    var connectionString = "mongodb://localhost/?safe=true;w=1;wtimeout=30s";
    var safemode = SafeMode.True;
    MongoServer server = MongoServer.Create(connectionString);
    MongoDatabase db = server.GetDatabase("testdb");
    MongoCollection<MongoDB.Bson.BsonDocument> coll = db.GetCollection<BsonDocument>("test");
    //coll.Find().Count();
    int i = 0;
    foreach (string table in tablelist)
    {

        using (SqlConnection conn = new SqlConnection(sqlconnectionstring))
        {
            string query = "select * from " + table;
            using (SqlCommand cmd = new SqlCommand(query, conn))
            {
                /// Delete the MongoDb Collection first to proceed with data insertion

                if (db.CollectionExists(table))
                {
                    MongoCollection<BsonDocument> collection = db.GetCollection<BsonDocument>(table);
                    collection.Drop();
                }
                conn.Open();
                SqlDataReader reader = cmd.ExecuteReader();
                List<BsonDocument> bsonlist = new List<BsonDocument>(1000);
                while (reader.Read())
                {
                    if (i == 1000)
                    {
                        using (server.RequestStart(db))
                        {
                            //MongoCollection<MongoDB.Bson.BsonDocument> 
                            coll = db.GetCollection<BsonDocument>(table);
                            coll.InsertBatch(bsonlist);
                            bsonlist.RemoveRange(0, bsonlist.Count);
                        }
                        i = 0;
                    }
                    ++i;
                    BsonDocument bson = new BsonDocument();
                    for (int j = 0; j < reader.FieldCount; j++)
                    {
                        if (reader[j].GetType() == typeof(String))
                            bson.Add(new BsonElement(reader.GetName(j), reader[j].ToString()));
                        else if ((reader[j].GetType() == typeof(Int32)))
                        {
                            bson.Add(new BsonElement(reader.GetName(j), BsonValue.Create(reader.GetInt32(j))));
                        }
                        else if (reader[j].GetType() == typeof(Int16))
                        {
                            bson.Add(new BsonElement(reader.GetName(j), BsonValue.Create(reader.GetInt16(j))));
                        }
                        else if (reader[j].GetType() == typeof(Int64))
                        {
                            bson.Add(new BsonElement(reader.GetName(j), BsonValue.Create(reader.GetInt64(j))));
                        }
                        else if (reader[j].GetType() == typeof(float))
                        {
                            bson.Add(new BsonElement(reader.GetName(j), BsonValue.Create(reader.GetFloat(j))));
                        }
                        else if (reader[j].GetType() == typeof(Double))
                        {
                            bson.Add(new BsonElement(reader.GetName(j), BsonValue.Create(reader.GetDouble(j))));
                        }
                        else if (reader[j].GetType() == typeof(DateTime))
                        {
                            bson.Add(new BsonElement(reader.GetName(j), BsonValue.Create(reader.GetDateTime(j))));
                        }
                        else if (reader[j].GetType() == typeof(Guid))
                            bson.Add(new BsonElement(reader.GetName(j), BsonValue.Create(reader.GetGuid(j))));
                        else if (reader[j].GetType() == typeof(Boolean))
                        {
                            bson.Add(new BsonElement(reader.GetName(j), BsonValue.Create(reader.GetBoolean(j))));
                        }
                        else if (reader[j].GetType() == typeof(DBNull))
                        {
                            bson.Add(new BsonElement(reader.GetName(j), BsonNull.Value));
                        }
                        else if (reader[j].GetType() == typeof(Byte))
                        {
                            bson.Add(new BsonElement(reader.GetName(j), BsonValue.Create(reader.GetByte(j))));
                        }
                        else if (reader[j].GetType() == typeof(Byte[]))
                        {
                            bson.Add(new BsonElement(reader.GetName(j), BsonValue.Create(reader[j] as Byte[])));
                        }
                        else
                            throw new Exception();
                    }
                    bsonlist.Add(bson);
                }
                if (i > 0)
                {
                    using (server.RequestStart(db))
                    {
                        //MongoCollection<MongoDB.Bson.BsonDocument> 
                        coll = db.GetCollection<BsonDocument>(table);
                        coll.InsertBatch(bsonlist);
                        bsonlist.RemoveRange(0, bsonlist.Count);
                    }
                    i = 0;
                }
            }
        }
    }
}
8 голосов
/ 07 декабря 2010

Путь водителя - FAR самый прямой. Инструменты импорта / экспорта просто фантастические, но только , если вы используете их как пару. Вас ждет дикая поездка, если ваша таблица содержит даты, и вы пытаетесь экспортировать из БД и импортировать в Монго.

Вам тоже повезло, находясь в c #. Мы используем ruby, и у нас есть таблица с 32 миллионами строк, которую мы перенесли в mongo. Нашим конечным решением было создать безумный SQL-оператор в postgres, который выводит json (включая некоторые довольно неаккуратные вещи для правильного отображения дат) и передает результаты этого запроса в командной строке в mongoimport. Это заняло невероятно разочаровывающий день, чтобы написать, и это не та вещь, которую действительно можно изменить.

Так что, если вам это удастся, используйте ado.net с драйвером Монго. Если нет, я желаю вам всего наилучшего: -)

(обратите внимание, что это исходит от фанатов монго)

1 голос
/ 28 апреля 2011

Если вы играете с Ruby, я сделаю гем, который поможет вам в этом: http://mongify.com/.

Исходный код можно найти: https://github.com/anlek/mongify/

Действительнопростое и понятное определение вашей схемы и того, как она должна переводиться в mongodb.Включая встраивание, переименование таблиц, переименование полей и множество других опций.

1 голос
/ 14 февраля 2011

Я должен был создать инструмент для этого.Он использует bcp.exe для экспорта данных в xml, затем преобразует их в json, используя Newtonsoft JSON.NET, а затем mongoimport для их импорта.Это заняло менее одного дня, но даты не поддерживаются.

Некоторый код ниже (очень не очищен:)

bcp.exe использует синтаксис, такой как: bcp.exe "SELECT * from GeoData.dbo.Airports FOR XML RAW ('Row'), ROOT ('Root'), ELEMENTS "запрос D: \ TEMP \ tmp1045.tmp -Uxxxx -Pxxxx -Sxxxx -w -r" "-q

json:

var r=XmlReader.Create("file://D:/1.xml");
    XmlDocument xdoc=new XmlDocument();
    xdoc.Load(r);
    string result="";





    //o["Root"]["Airport"];
    foreach(XmlNode n in xdoc.ChildNodes[0]){
        var rr= JsonConvert.SerializeXmlNode(n);    

        JObject o=JObject.Parse(rr);    

        var co=o.Children().Children().First();     

        foreach (JToken c in co.Children().Where(cc=>cc.Type==JTokenType.Property).ToList()){                   
            var prop=c as JProperty;            
            double d;
            if (double.TryParse(co[prop.Name].Value<string>(),out d))
            {
                co[prop.Name] = d;
            }           
            //c.Value<string>().Dump();
            //c.Value<string>().Dump();
            //co[c.Name]
        }

        //co["APT_Latitude"].Value<decimal>().Dump();       
        result=result + co.ToString(Newtonsoft.Json.Formatting.None)+"\r\n";


    }
    File.WriteAllText("D:/1.json",result);

    //result.Dump();

Mongoimport: D: \ MongoDB \ mongoimport.exe -c "test" -d "MongoStatic" 1.json> 1

0 голосов
/ 07 декабря 2010

Оба драйвера Norm & samus c # mongo поддерживают строго типизированные классы, которые передаются в качестве документов. Значит это круто как Nhiberbate и LINQ to SQL.

Так что моя идея в том, что вы можете использовать LINQ to SQL для создания сущности в c # (классы, представляющие таблицы) для извлечения данных с сервера sql, и вы можете использовать тот же строго типизированный класс для вставки в mongo db.

Убедитесь, что ваши классы должны иметь атрибут mongo identifier (в NoRM) в любом из полей. Это для создания уникального идентификатора для документа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...