我的任务是将数据从MongoDB数据库移植到MySQL数据库.(有用于移植强有力的理由-因此它有做).
MongoDB集合:
我们尝试过的安装程序:
我们从MongoDB中一次在内存中获取1K文档,进行必要的处理,然后将它们保存到MySQL数据库,一次批量写入500.
我们面临的问题是每2.5 MB文档,服务器窒息而Mongo响应非常缓慢 - 超时应用程序的数据获取操作(在处理1M文档时释放RAM)
我们正在慢慢地通过杀死mongod进程并在崩溃时每2.5M记录再次启动它 - 但我敢打赌我们做错了什么.
题:
我应该将Mongo服务器移动到基于Linux的大型实例和MySQL移动到Amazon RDS并在PHP中重写转换应用程序吗?会有帮助吗?
我们决定将它们全部放在一个盒子上的原因是在不同的盒子上安装不同服务器的延迟问题 - 但我想如果盒子窒息那就没有实际意义.
我可以尝试哪些其他东西/我可以使用的提示?
感谢您阅读这篇文章!
- 更新01 -
自从我重新启动我的应用程序并进行了以下更改后大约需要6个小时:
我的记忆是100%消耗,但应用程序仍在运行.(上次它在52分钟内嘶哑).Mongo吃了6.8 GB的RAM,MySQL - 450 Megs和转换器应用程序 - 400 Megs(约值).
到目前为止处理了11M的记录 - 但速度从大约500条记录/秒下降到370记录/秒.
接下来的步骤是将Mongo和MySQL服务器隔离在一起,并将所有这些服务器保存在同一个Amazon可用区中,以最大限度地减少延迟.
- 更新02 -
我们对代码进行了一些更改以使用Mongo Cursor并让它自动自动增加,而不是自己执行.skip().limt().这大大加快了这个过程,我们从之前的300多个每秒做了1250条记录.但是,应用程序开始消耗太多内存,并且会耗尽RAM并崩溃,并且需要在每2M记录后重新启动.
我们使用了这段代码:
var docs = db[collectionName].Find(query);
docs.SetBatchSize(numOfResultsToFetchAtATime);
foreach (var d in docs) {
// do processing
}
Run Code Online (Sandbox Code Playgroud)
所以它的作用是一次获取'numOfResultsToFetchAtATime'记录 - …
public class ScheduledEvent : Event
{
public DateTimeOffset StartDateTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
StartDateTime = 5/27/2013 2:09:00 AM +00:00代表05/26/2013 07:09 PM PST
在MongoDB中记录了什么:
> db.ScheduledEvent.find().toArray()
[
{
"_id" : BinData(3,"ZE2p31dh00qb6kglsgHgAA=="),
"Title" : "Today 26th at 7:09pm",
"Length" : "00:00:00",
"MoreInformation" : "http://1.com",
"Speakers" : [
{
"_id" : BinData(3,"ndzESsQGukmYGmMgKK0EqQ=="),
"Name" : "Mathias Brandewinder"
}
],
"Location" : {
"_id" : BinData(3,"AAAAAAAAAAAAAAAAAAAAAA=="),
"Name" : "Somwhere "
},
"Organizers" : [
{
"_id" : BinData(3,"AAAAAAAAAAAAAAAAAAAAAA=="),
"Name" : null
}
],
"CreatedOn" …Run Code Online (Sandbox Code Playgroud) 大家好,我使用mongodb 2.4.6版本和Windows 2008 64位版本.
我有一个有200万条记录的集合,需要在客户端进行搜索和分页.
db.products.find({"catalogs":1205}).skip().limit() is very fast .
Run Code Online (Sandbox Code Playgroud)
但是当计算总记录数时:
db.products.find({"catalogs":1205},{"_id":1}).count() is too slow.
>> 442312 records.
>>[log] Sat Sep 28 00:20:01.566 [conn10] command products.$cmd command: { count: "products", query: { catalogs: 1205.0 }, fields: { _id: 1.0 } } ntoreturn:1 keyUpdates:0 locks(micros) r:460681 reslen:48 460ms
Run Code Online (Sandbox Code Playgroud)
这个计数命令经过的时间是460ms,太慢了.如果我们有很多请求那么可怕.
我为'catalogs'字段创建了一个索引,并且无法使用$inc命令,因为查询可能非常复杂.
谷歌搜索一些像这个问题,发现这个'计数'性能错误已经修复mongodb 2.4版本.
来自http://docs.mongodb.org/manual/release-notes/2.4-overview/
Improvements to count provide dramatically faster count operations. Counting is now up to 20 times faster for low cardinality index based counts.
Run Code Online (Sandbox Code Playgroud)
有什么方法可以提高数量?谢谢. …
这是我收藏中的一个示例文档:
Books
[
id: 1,
links:
[
{text: "ABC", "url": "www.abc.com"},
{text: "XYZ", "url": "www.xyz.com"}
]
]
Run Code Online (Sandbox Code Playgroud)
我想在一次更新操作中替换 links 数组。以下是如何修改上述文档的示例:
Books
[
id: 1,
links:
[
{text: "XYZ", "url": "www.xyz.com"},
{text: "efg", "url": "www.efg.com"}, <== NEW COPY OF THE ARRAY
{text: "ijk", "url": "www.ijk.com"}
]
]
Run Code Online (Sandbox Code Playgroud)
如您所见,链接数组已被替换(删除旧数据,添加新数据)。
我很难用,Update.Set()因为它说它MyLinks<>不能映射到BsonValue
我尝试了许多不同的方法来实现这一目标,但都失败了,包括.PushAllWrapped<WebLinkRoot>("links", myDoc.WebLinks). 我尝试过的所有方法都会将新值附加到数组中,而不是替换数组。
由于 MongoDB 似乎没有提供一种简单的方法来替换子文档数组或类似的方法.ClearArray(),那么在单个查询中添加新元素之前确保清除数组的最佳方法是什么?
我正在使用mongodb的c#驱动程序,并希望对我正在创建的Web API使用聚合查询.对于我的聚合查询,我关注的是具有用户名,日期和步骤的配置文件类.我想创建一个查询,选择用户名并获取给定周的总步数,按总步数降序排列.我只想显示他们的用户名和他们的总步数.
当我尝试聚合查询时,我遇到了一些问题,我的某些字段将显示为null.所以,我认为我的查询结构不正确.
我有一个"配置文件"类,我目前用于我的数据.
[BsonIgnoreExtraElements]
[DataContract]
public class Profile
{
[DataMember]
public string Username { get; set; }
[DataMember]
public DateTime Date { get; set; }
[DataMember]
public uint? Steps { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我使用以下方法创建了一些测试数据,例如配置文件
//Test data
for (uint index = 1; index < 20; index++)
{
Profile aprofile = new Profile
{
Username = string.Format("testuser{0}", index),
Date = RandomDay(),
Steps = (index + index + index)*2
};
AddProfile(aprofile);
}
Run Code Online (Sandbox Code Playgroud)
如果我运行代码几次并查询特定用户,我得到的数据如下:
[{"Username":"testuser1","Date":"2014-07-03T00:00:00Z","Steps":6},
{"Username":"testuser1","Date":"2014-07-07T05:00:00Z","Steps":6},
{"Username":"testuser1","Date":"2014-07-17T05:00:00Z","Steps":6},
{"Username":"testuser1","Date":"2014-07-18T05:00:00Z","Steps":6}]
Run Code Online (Sandbox Code Playgroud)
然后,我有几个静态方法来查找我的聚合查询的最早日期和最新日期.
//gets a datetime …Run Code Online (Sandbox Code Playgroud) 尝试将ASP.NET 5网站与MongoDB C#驱动程序集成,但遇到了一些问题.
首先,此处列出的示例http://docs.mongodb.org/ecosystem/drivers/csharp/都标记为已过时.
其次,当我尝试构建时,即使IDE中的所有内容都正常,我也会遇到非常奇怪的编译错误(无法找到类型或命名空间).
这是我非常基本的HomeController.cs
using Microsoft.Framework.DependencyInjection;
using Microsoft.AspNet.Mvc;
using MongoDB.Driver;
using System;
namespace Docker.Web.Controllers
{
public class HomeController : Controller
{
private AppSettings _appSettings;
public HomeController(IServiceProvider serviceProvider)
{
_appSettings = serviceProvider.GetService<AppSettings>();
}
public IActionResult Index()
{
var server = new MongoClient(_appSettings.MongoConnection).GetServer();
var database = server.GetDatabase(_appSettings.MongoDatabase);
return View();
}
}
}
Run Code Online (Sandbox Code Playgroud)
主要问题是我可以在ASP.NET 5中使用C#MongoDB驱动程序吗?
使用Visual Studio 2015预览并定位KRE版本KRE-CoreCLR-x86.1.0.0-beta2
任何帮助是极大的赞赏!
使用新驱动程序2.0构建索引的新方法是什么?没有关于此的任何文档.
显然这现在适用于新的IndexKeysDefinitionBuilder<>界面,但这是我到目前为止所有.
我有以下结构:
public class Category
{
[BsonElement("name")]
public string CategoryName { get; set; }
[BsonDateTimeOptions]
[BsonElement("dateCreated")]
public DateTime DateStamp { get; set; }
[BsonElement("tasks")]
public List<TaskTracker.Task> Task { get; set; }
}
public class Task
{
[BsonElement("name")]
public string TaskName { get; set; }
[BsonElement("body")]
public string TaskBody { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我试图查询a Category以获取所有TaskName值,然后将它们返回到列表框中以显示.
我试过使用这个查询:
var getTasks = Categories.Find<Category>(x => x.CategoryName == catName)
.Project(Builders<Category>.Projection
.Include("tasks.name")
.Exclude("_id"))
.ToListAsync()
.Result;
Run Code Online (Sandbox Code Playgroud)
但得到的回报是:{"tasks": [{"name: "test"}]}.
无论如何只返回字符串值?
该BsonDocument.ToJson()方法返回无效的JSON,因为ObjectID()它ISODate是无效的JSON.
从仲裁BSON文档获取有效JSON的最佳方法是什么?
要在MongoDB中使用事务,您必须首先开始一个会话。当您有许多事务时,您可以重用现有会话或为每个事务创建一个新会话。
我对这两个选项进行了基准测试(下面的代码),结果令人困惑。与为所有事务使用单个会话相比,为每个事务使用全新会话似乎要快得多(快2到3倍)。
谁能解释为什么会这样?后台如何进行工作?它们的含义是什么?这意味着什么成本(以及何时以及为什么)?我真的很想了解,感谢您提出任何建议。
Stopwatch sw = new Stopwatch();
coll1.InsertOne(new BsonDocument { { "Seq", 0 } });
sw.Start();
for (int i = 1; i <= reps; i++) {
using (var session = client.StartSession()) {
session.StartTransaction();
coll1.InsertOne(session: session, document: new BsonDocument { { "Seq", i } });
session.CommitTransaction();
}
}
sw.Stop();
Console.WriteLine($"{reps / sw.Elapsed.TotalSeconds} OP/s with fresh sessions.");
coll2.InsertOne(new BsonDocument { { "Seq", 0 } });
sw.Restart();
using (var session = client.StartSession()) {
for (int i = 1; i <= reps; i++) …Run Code Online (Sandbox Code Playgroud)