标签: mongodb-.net-driver

C# - 使用 NoSQL (MongoDB) 生成类似 Id 的“身份”?

我一直在 C# 中使用 MongoDB,并且一直使用 ObjectId,后来又使用 GUID 作为我的实体 Id。我讨厌查看这些 Id,我认为这是违反直觉的...我真的很希望能够使用整数或长整型,例如关系数据库的 Identity 列。但我很难找到一种方法来做到这一点。如果我使用集合 max + 1,这将导致竞争条件。我读过有关使用 Hi-Lo 生成器算法的内容,但它是如何工作的呢?如果我有 10 个应用程序服务器运行相同的代码怎么办?这是否意味着每个集合必须有 10 个 hi lo 身份范围?

如果有人可以向我指出一个 C# 算法来分享,那就太好了!顺便说一下,我见过 RNGCryptoServiceProvider,但不能保证它是唯一的,而且它不是一个连续的 int/long Identity。那时我宁愿使用 Hi-Lo...

谢谢,蒂姆

c# identity unique mongodb mongodb-.net-driver

2
推荐指数
1
解决办法
6430
查看次数

在 MongoDb + C# 中反序列化没有默认构造函数的对象

考虑两个类:

public class Entity
{
    public ObjectId Id { get; set; }
    public E2 e = new E2(ConfigClass.SomeStaticMethod());
}

public class E2
{
    [BsonIgnore]
    public int counter = 5;
    public DateTime last_update { get; set; }

    public E2(int c)
    {
        counter = c;
    }
}
Run Code Online (Sandbox Code Playgroud)

Entity我将像这样向 MongoDb存储然后检索类型的对象(假设集合为空):

var collection = database.GetCollection<Entity>("temp");
collection.Save<Entity>(new Entity());
var list = collection.FindAs<Entity>(new QueryDocument());
var ent = list.Single();
Run Code Online (Sandbox Code Playgroud)

无论ConfigClass.SomeStaticMethod()返回什么,该counter字段都将为零(整数的默认值)。但是如果我向类添加默认构造函数,E2那么counter将会是5.

这意味着 MongoDb 的 C# 驱动程序在调用非默认构造函数时出现问题(这是完全可以理解的)。我知道BsonDefaultValue …

c# mongodb bson mongodb-.net-driver

2
推荐指数
1
解决办法
2616
查看次数

多个复合键

这是我的实体:

{
     name: "",
     list: [{
       a: 1,
       b: 1   
     }]
}
Run Code Online (Sandbox Code Playgroud)

我想创建两个索引,一个按名称创建,另一个为 a 和 b 一起创建。

示例:尝试插入 a=1 和 b=1 两次一定会抛出错误。

我的mongodb驱动是2.

为了名字,我是这样工作的:

    await collection.Indexes.CreateOneAsync(Builders<MyEntity>.IndexKeys.Ascending(m => m.Name), new CreateIndexOptions()
    {
        Unique = true,
        Sparse = true
    });
Run Code Online (Sandbox Code Playgroud)

如何为列表中的两个属性执行此操作?

mongodb mongodb-.net-driver

2
推荐指数
1
解决办法
1392
查看次数

MongoDB C# 2 驱动程序 - 无法从 BsonType“Double”反序列化“String”

我是 MongoDB 新手。我正在尝试检索查找集合中的所有条目。我收到以下错误:

{“反序列化 Stock.Models.StockLookup 类的 Symbol 属性时发生错误:无法从 BsonType 'Double' 反序列化 'String'。”}

这是我收到错误的代码:

var stockLookups = _stockLookupRepository.GetAllAsync().Result.OrderBy(l => l.Symbol);
Run Code Online (Sandbox Code Playgroud)

这是被调用的方法:

public async Task<List<StockLookup>> GetAllAsync()
    {
        var result = await _collection.Find(sl => sl.Symbol != null).ToListAsync();
        return result;
    }
Run Code Online (Sandbox Code Playgroud)

这是 StockLookup 类:

public class StockLookup
{
    public ObjectId Id { get; set; }
    public string Symbol { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

谁能帮我找出问题所在吗?任何帮助将不胜感激。

谢谢!

c# mongodb mongodb-.net-driver

2
推荐指数
1
解决办法
9754
查看次数

如何同时更新插入记录和数组元素?

这意味着将被读取为双重更新插入操作,首先更新插入文档,然后更新插入数组元素。

所以 MongoDB 对我来说是一个非规范化的存储(我们是事件源的),我试图处理的事情之一就是它的并发性。问题是这样的:

  • 事件可能会无序出现,因此对数据库的每次更新都需要进行更新插入。
  • 我不仅需要能够更新插入父文档,还需要能够更新插入该文档的数组属性中的元素。

例如:

  • 如果该文档不存在,请创建它。该流中的所有事件都有文档的 ID,但只有部分信息取决于事件。
  • 如果该文档确实存在,则更新它。这是简单的部分。更新命令仅写为 UpdateOneAsync 和 upsert。
  • 如果事件实际上是要更新列表,则需要更新插入该列表元素。因此,如果文档不存在,则需要创建它,并且列表项将被更新插入(导致插入);如果文档确实存在,那么我们需要找到该元素并将其更新为更新插入,因此如果该元素存在,则更新它,否则插入它。

如果可能的话,让它作为单个原子操作执行将是理想的,但如果它只能通过多个步骤完成,那就这样吧。由于 2.x 驱动程序发生了巨大变化,我在网上得到了许多混合示例。不确定除了 UpdateOneAsync 之外我还在寻找什么。目前使用 2.4.x。解释的例子将不胜感激。TIA

注意:重申这是关于 MongoDB C# 驱动程序 2.4.x 的问题

mongodb event-sourcing mongodb-.net-driver

2
推荐指数
1
解决办法
947
查看次数

BsonChunkPool 和内存泄漏

我使用 Mongodb 3.6 + .net 驱动程序 (MongoDb.Driver 2.10) 来管理我们的数据。最近,我们注意到我们的服务(后台)消耗了大量内存。分析转储后,发现有一个名为 BsonChunkPool 的 mongo 对象始终消耗大约 0.5 GB 的内存。正常吗?我真的找不到任何关于这种类型及其实际用途的有价值的文档。有人可以帮忙吗?

mongodb mongodb-.net-driver

2
推荐指数
1
解决办法
1684
查看次数

MongoDB.net 驱动程序 - 项目到不同的类

当尝试将类型化文档投影到不同的类中时,我得到以下信息:在表达式树 new NewItem({document}, 1021) 中的类型“ NewItem ”上找不到构造函数参数“origItem”的成员匹配。

类的简化示例如下:

public class OriginalItem
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
    public IList<double> Data { get; set; }
    
    public OriginalItem() { }
}
public class NewItem
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
    public double Value { get; set; }
    
    public NewItem() { }
    public NewItem( OriginalItem origItem, int targetIdx )
    {
        Id = …
Run Code Online (Sandbox Code Playgroud)

.net c# mongodb aggregation-framework mongodb-.net-driver

2
推荐指数
1
解决办法
1836
查看次数

如何使用 C# 在 MongoDb 查找查询中使用多个过滤器

我有这个查询在 datagrip 中运行良好

test> db.getCollection("comments").find({status: {$ne: "APPROVED"},storyID: {$regex: "bbjfn-*"}})
Run Code Online (Sandbox Code Playgroud)

我只是想知道如何使用 MongoDB Driver 2.13.1 在 C# 中实现同样的功能

IMongoDatabase database = MongoClient.GetDatabase(Program.Settings.MongoDB.Database);
IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("comments");

var filter = Builders<BsonDocument>.Filter.Eq("status", new BsonDocument("$ne", "APPROVED")) & 
Builders<BsonDocument>.Filter.Eq("storyID", new BsonDocument("$regex", "bbjfnfn-*"));

var results = await collection.FindAsync(filter);
Run Code Online (Sandbox Code Playgroud)

不起作用..我做错了什么?

c# mongodb mongodb-query mongodb-.net-driver

2
推荐指数
1
解决办法
5554
查看次数

如何添加bsondocuments列表作为bsondocument的元素

如何使用官方c#驱动程序创建以下文档?

{
    "name": "John Doe",
    "classess": [
        {
            "classname": "Class1"
        }
        {
            "classname": "Class2"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

以下代码不起作用

string cs = "mongodb://localhost";
MongoServer server = MongoServer.Create(cs);
MongoDatabase test = server.GetDatabase("test");

MongoCollection<BsonDocument> students = test.GetCollection("students");

BsonDocument doc = new BsonDocument();
doc.Add(new BsonElement("name", "John doe"));

//Create the list
List<BsonDocument> classes = new List<BsonDocument>();
classes.Add(new BsonDocument(new BsonElement("classname","Test1")));
classes.Add(new BsonDocument(new BsonElement("classname","Test2")));
Run Code Online (Sandbox Code Playgroud)

出于明显的原因,以下行将抛出错误.这样做的正确方法是什么?

doc.Add(new BsonElement("classess",classes));
students.Insert(doc);
Run Code Online (Sandbox Code Playgroud)

谢谢.

c# mongodb mongodb-.net-driver

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

BSonElement到c#数据类型

我的数据库中有一个"BSonElement",我用标准查询重试它.

问题是我无法将BsonDocument转换为Type.

例:

更新1:

 public partial class item_Stat
{

    [BsonExtraElements]
    public BsonDocument all_stat;
}
Run Code Online (Sandbox Code Playgroud)

基本上,我已经进入我的DB 10-15属性(字段),我可以用"BsonExtraElements"阅读.通过这种方式,我可以重试属性而无需在C#中定义它.

all_stat,可以有10-15-20属性,在dinamically变化.C#是键入的语言,所以我无法在C#中定义此属性,并且我使用了ExtraElements.

问题是当我从DB查询对象时.

var item_db = myMongoCollection.find(theQuery); // find the OBJECT

item_db.all_stat // all the property hare HERE

// find the property "category_01"
var i =  item_db.all_stat.Where(p => p.Name == "category_01").Single();

// ok, i have found the Category, so i can cast it to C# Data Type    
var typed_value = (ItemStatSingle) i.Value // BsonElement to ItemStatSingle
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-.net-driver

1
推荐指数
2
解决办法
6625
查看次数