标签: mongodb-.net-driver

mongodb-csharp驱动程序 - 如何将属性保存为引用而不是嵌入?

我们在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)

mongodb mongodb-.net-driver

11
推荐指数
1
解决办法
3568
查看次数

MongoDB对层次类型查询的适用性

我有一个特定的数据操作要求,我已经解决了如何在SQL Server和PostgreSQL中做.但是,我对速度不太满意,所以我正在调查MongoDB.

描述查询的最佳方法如下.描绘美国的分层数据:国家,州,县,市.假设一个特定的供应商可以为整个加州服务.另一个可能只服务于洛杉矶.可能有数十万个供应商,他们都可以从这个层次结构中的某些点进行服务.我并没有把它与Geo混淆 - 我用它来说明需要.

使用递归查询,可以很容易地获得可以为特定用户提供服务的所有供应商的列表.如果他是在说帕萨迪纳,美国加利福尼亚州洛杉矶,我们会走到层次得到应用的ID,然后查询回落,找到供应商.

我知道这可以优化.同样,这只是一个简单的查询示例.

我知道MongoDB是一个文档存储.这非常适合我的其他需求.问题是它对我描述的查询类型有多适合?(我知道它没有连接 - 这些是模拟的).

我知道这是一个"一段字符串多长时间"的问题.我只是想知道是否有任何人有使用MongoDB做这种事情的经验.从0到测试可能需要一段时间,如果MongoDB不适合这个,我希望节省时间.

当地的电影商店"A"可以在斯普林菲尔德供应Blu-Rays.具有全州分布的连锁店"B"可以向所有IL提供Blu-Rays.按需下载商店"C"可以供应给所有美国用户.

如果我们想要获得伊利诺斯州斯普林菲尔德的所有适用电影供应商,那么答案将是[A,B,C].

换句话说,在层次结构上有许多不同级别的供应商.

hierarchical-data mongodb mongodb-.net-driver

11
推荐指数
1
解决办法
9430
查看次数

MongoDB是否支持soundex或模糊匹配?

MongoDB是否支持soundex或模糊匹配?我想发现基本联系人姓名和地址字段的欺骗.我正在使用官方的C#驱动程序.谢谢

soundex mongodb mongodb-.net-driver

11
推荐指数
1
解决办法
1万
查看次数

Mongo C#驱动程序:反序列化BsonValue

我在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类的属性.

.net c# mongodb mongodb-.net-driver

11
推荐指数
2
解决办法
3万
查看次数

我什么时候应该打开和关闭MongoDB连接?

我对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

11
推荐指数
1
解决办法
1万
查看次数

在MongoDB中将Guid存储为String有什么缺点?

应用程序在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 mongodb-.net-driver

11
推荐指数
2
解决办法
6561
查看次数

MongoDB和多个C#客户端线程

我有一个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 mongodb-.net-driver

11
推荐指数
1
解决办法
1265
查看次数

将对象反序列化为MongoDB C#Driver的接口

我正在开发一个使用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)

c# mongodb mongodb-.net-driver

11
推荐指数
2
解决办法
8216
查看次数

Mongo抛出"元素名称'名称'无效'例外

我正在更新一个简单的字段.

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)

.net c# mongodb mongodb-.net-driver

11
推荐指数
1
解决办法
5754
查看次数

在MongoDB中计数不正确

技术:

  • MongoDB 3.0.8(MMAPv1),通过mLab托管在AWS上的非分片专用集群(主要,辅助和仲裁),3.7GB RAM
  • MongoDB 2.3的C#驱动程序
  • 连接字符串:

mongodb的:// USER:PASS@MYMONGO1.com:1234,MYMONGO2.com:1234/DB_NAME replicaSet = REPLICA_SET_NAME

假设

  • 我有一个名为Package的字段集合产品.
  • 有索引:"套餐":1
  • 永远不会删除此集合中的对象.
  • 字段包永远不会更新.
  • 不时插入新对象.

每天一次我记录这个集合的特定计数(每次都有相同的参数):

db.Products({"Package": "Box"}).count()
// actual code running in C#:
productsCollection.Find(p => p.Package == "Box").Count()
Run Code Online (Sandbox Code Playgroud)

我希望每天的结果都相同或更高. 但有时我会得到一个较小的价值.第二天它又变得正确了.它在两种不同的环境中重现.

例:

  • 第1天:4,563,135
  • 第2天:4,563,135
  • 第3天:4,563,124(比预期的少11个)
  • 第4天:4,563,135

我试图通过C#和Mongo直接手动重现它,但是失败了(值总是正确的).

这是怎么回事?

c# linq mongodb mongodb-.net-driver

11
推荐指数
1
解决办法
375
查看次数