我们在C#.NET项目中对Mongo数据库进行了一点点调查,看看它是否适合我们,而且我遇到了samus对mongodb-csharp驱动程序的一个小问题,我不确定如何实现.
鉴于以下简化模型:
public class Campaign
{
public string Name { get; set; }
public IEnumerable<Placement> Placements { get; set; }
}
public class Placement
{
public string Name { get; set; }
//this should be a reference rather than included in the collection
public Site Site { get; set; }
}
//this should be its own collection, and not embedded anywhere
public class Site
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我们试图弄清楚,如上面的评论所示,如何将Site保存为引用类型而不是嵌入Placement中.网站是其自己的顶级集合,可以独立于每个广告系列进行更改.
理想情况下,我想使用MongoConfigurationBuilder而不是修改我的POCO.我似乎无法找到有关如何实现这一目标的任何文档.
我希望它会像以下一样简单:
var config = new …Run Code Online (Sandbox Code Playgroud) 我有一个特定的数据操作要求,我已经解决了如何在SQL Server和PostgreSQL中做.但是,我对速度不太满意,所以我正在调查MongoDB.
描述查询的最佳方法如下.描绘美国的分层数据:国家,州,县,市.假设一个特定的供应商可以为整个加州服务.另一个可能只服务于洛杉矶.可能有数十万个供应商,他们都可以从这个层次结构中的某些点进行服务.我并没有把它与Geo混淆 - 我用它来说明需要.
使用递归查询,可以很容易地获得可以为特定用户提供服务的所有供应商的列表.如果他是在说帕萨迪纳,美国加利福尼亚州洛杉矶,我们会走到层次得到应用的ID,然后查询回落,找到供应商.
我知道这可以优化.同样,这只是一个简单的查询示例.
我知道MongoDB是一个文档存储.这非常适合我的其他需求.问题是它对我描述的查询类型有多适合?(我知道它没有连接 - 这些是模拟的).
我知道这是一个"一段字符串多长时间"的问题.我只是想知道是否有任何人有使用MongoDB做这种事情的经验.从0到测试可能需要一段时间,如果MongoDB不适合这个,我希望节省时间.
例
当地的电影商店"A"可以在斯普林菲尔德供应Blu-Rays.具有全州分布的连锁店"B"可以向所有IL提供Blu-Rays.按需下载商店"C"可以供应给所有美国用户.
如果我们想要获得伊利诺斯州斯普林菲尔德的所有适用电影供应商,那么答案将是[A,B,C].
换句话说,在层次结构上有许多不同级别的供应商.
MongoDB是否支持soundex或模糊匹配?我想发现基本联系人姓名和地址字段的欺骗.我正在使用官方的C#驱动程序.谢谢
我在mongodb中有一个文档,结构类似于:
{
"_id": "abcdef01234",
"Name": "Product A",
"Dimensions": [
{
"Height": 32,
"Width": 64
},
{
"Height": 16,
"Width": 32
},
{
"Height": 8,
"Width": 16
}
]
}
Run Code Online (Sandbox Code Playgroud)
我还有一个定义为表示维度的类(上面的子文档)
public class Dimension
{
public int Height { get; set; }
public int Width { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我以这种方式选择"产品A"文档:
MongoServer srv = MongoServer.Create(myConnStr);
BsonDocument doc = srv["db"]["products"].FindOneById(ObjectId.Parse("abcdef01234"));
BsonValue dimensionsVal = doc["Dimensions"];
Run Code Online (Sandbox Code Playgroud)
现在我有一个名为dimensionsVal的BsonValue,它的类型为BsonArray.我真正想要的是List <Dimension>.如何将dimensionsVal转换为List <Dimension>?
编辑 维度类实际上比我描述的要复杂得多.由于内存问题,我希望将Dimensions与产品分开.我想将产品保留在内存中,但不是(可能是巨大的)维度列表.因此,我不希望将List作为Product类的属性.
我对MongoDB和NoSQL很新,我刚刚开始使用MongoDB/Norm/ASP.NET MVC 3构建一个站点.
我想知道我应该如何确定与Mongo数据库的连接.
现在我有一个Basecontroller,它实现了MongoSession和onActionExecuted我处理它所以我所有的派生控制器都可以访问我的MongoSession.MongoSession类在其构造函数中打开一个连接,并将它放在Dispose()上,就像它今天的工作方式一样.
private IMongo _mongo;
public MongoSession()
{
_mongo = Mongo.Create("connString");
}
public void Dispose()
{
_mongo.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
如果我在控制器中做其他事情,我有点担心它可能会持续打开太长时间.
这种方法是否应该不会冒太多连接的风险,或者我应该做更像下面的示例方法?
public void Add<T>(T item) where T : class, new()
{
using (var mongo = Mongo.Create("connString"))
{
mongo.GetCollection<T>().Insert(item);
}
}
Run Code Online (Sandbox Code Playgroud)
另一个跟进问题是:
通过Norm"昂贵"操作打开和关闭MongoDB连接?
database-connection scoping mongodb norm mongodb-.net-driver
应用程序在Mongo中保留Guid字段,最终存储为BinData:
"_id" : new BinData(3, "WBAc3FDBDU+Zh/cBQFPc3Q==")
Run Code Online (Sandbox Code Playgroud)
在这种情况下的优点是紧凑性,当需要对应用程序进行故障排除时会出现缺点.Guids通过URL传递,并且在转到Mongo控制台时不断将它们转换为BinData有点痛苦.
除了增加尺寸外,将Guid存储为字符串有什么缺点?一个优点是易于故障排除:
"_id" : "3c901cac-5b90-4a09-896c-00e4779a9199"
Run Code Online (Sandbox Code Playgroud)
这是C#中持久化实体的原型:
class Thing
{
[BsonIgnore]
public Guid Id { get; set; }
[BsonId]
public string DontUseInAppMongoId
{
get { return Id.ToString(); }
set { Id = Guid.Parse(value); }
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个MongoDB的单个主要实例要连接.我正在使用C#驱动程序(最新版本)来连接和使用MongoDB.
我的客户端应用程序是多线程的,其中进程将以不同的时间间隔定期运行以生成报告.当多个线程正在运行,并且我在驱动程序上调用各种函数(例如server.DatabaseExists(...))时,我一直遇到异常.
"请求的名称有效,但未找到所请求类型的数据"
at System.Net.Dns.GetAddrInfo(String name)
at System.Net.Dns.InternalGetHostByName(String hostName, Boolean includeIPv6)
at System.Net.Dns.GetHostAddresses(String hostNameOrAddress)
at MongoDB.Driver.MongoServerAddress.ToIPEndPoint(AddressFamily addressFamily) in C:\work\rstam\mongo-csharp-driver\Driver\Core\MongoServerAddress.cs:line 195
at MongoDB.Driver.MongoServerInstance.GetIPEndPoint() in C:\work\rstam\mongo-csharp-driver\Driver\Core\MongoServerInstance.cs:line 339
at MongoDB.Driver.Internal.MongoConnection.Open() in C:\work\rstam\mongo-csharp-driver\Driver\Internal\MongoConnection.cs:line 368
at MongoDB.Driver.Internal.MongoConnection.GetNetworkStream() in C:\work\rstam\mongo-csharp-driver\Driver\Internal\MongoConnection.cs:line 574
at MongoDB.Driver.Internal.MongoConnection.SendMessage(MongoRequestMessage message, SafeMode safeMode, String databaseName) in C:\work\rstam\mongo-csharp-driver\Driver\Internal\MongoConnection.cs:line 555
at MongoDB.Driver.MongoCursorEnumerator`1.GetReply(MongoConnection connection, MongoRequestMessage message) in C:\work\rstam\mongo-csharp-driver\Driver\Core\MongoCursorEnumerator.cs:line 295
at MongoDB.Driver.MongoCursorEnumerator`1.GetFirst() in C:\work\rstam\mongo-csharp-driver\Driver\Core\MongoCursorEnumerator.cs:line 253
at MongoDB.Driver.MongoCursorEnumerator`1.MoveNext() in C:\work\rstam\mongo-csharp-driver\Driver\Core\MongoCursorEnumerator.cs:line 141
at MongoDB.Driver.MongoDatabase.GetCollectionNames() in C:\work\rstam\mongo-csharp-driver\Driver\Core\MongoDatabase.cs:line 645
at MongoDB.Driver.MongoDatabase.CollectionExists(String collectionName) in C:\work\rstam\mongo-csharp-driver\Driver\Core\MongoDatabase.cs:line 297
Run Code Online (Sandbox Code Playgroud)
运行一个线程不会导致此问题.我理解MongoDB是线程安全的,所以我无法理解原因和补救措施.
我正在开发一个使用MongoDB(带有C#驱动程序)和DDD的项目.
我有一个类(聚合),它具有一个类型是接口的属性.在另一个类中,我实现了这个接口.此类具有另一个属性,其类型是接口,并使用另一个实现的类进行设置.
下面的代码解释得更好:
// Interfaces
public interface IUser {
Guid Id { get; set;}
IPartner Partner{ get; set; }
}
public interface IPartner {
IPhone Mobile { get; set; }
}
public interface IPhone {
string number { get; set; }
}
// Implemented Classes
public class User: IUser {
[BsonId(IdGenerator = typeof(GuidGenerator))]
public Guid Id { get; set; }
[BsonIgnoreIfNull]
public IPartner Partner { get; set; }
}
public struct Partner : IPartner …Run Code Online (Sandbox Code Playgroud) 我正在更新一个简单的字段.
var filterDocument = new BsonDocument { { "name", "alice" } };
var newDocument = new BsonDocument { { "name", "Alice" } };
collection.UpdateOne(filterDocument, newDocument);
Run Code Online (Sandbox Code Playgroud)
但是当我到达更新语句时,我得到一个例外 {"Element name 'name' is not valid'."}
这个元素名称有什么问题?
更新
重写它:
var filterDocument = new BsonDocument { { "x", "alice" } };
var newDocument = new BsonDocument { { "y", "Alice" } };
collection.UpdateOne(filterDocument, newDocument);
Run Code Online (Sandbox Code Playgroud)
抛出异常 {"Element name 'y' is not valid'."}
此外,UpdateOne()或UpdateMany()没有任何区别.
另外,从外壳来看它很好.
> db.crud.update({name:'alice'},{name:'Alice'})
WriteResult({ "nMatched" : 1, "nUpserted" : …Run Code Online (Sandbox Code Playgroud) mongodb的:// USER:PASS@MYMONGO1.com:1234,MYMONGO2.com:1234/DB_NAME replicaSet = REPLICA_SET_NAME
每天一次我记录这个集合的特定计数(每次都有相同的参数):
db.Products({"Package": "Box"}).count()
// actual code running in C#:
productsCollection.Find(p => p.Package == "Box").Count()
Run Code Online (Sandbox Code Playgroud)
我希望每天的结果都相同或更高. 但有时我会得到一个较小的价值.第二天它又变得正确了.它在两种不同的环境中重现.
例:
我试图通过C#和Mongo直接手动重现它,但是失败了(值总是正确的).
这是怎么回事?