标签: mongodb-.net-driver

如何将字符串列表序列化为 objectid 列表

我有一个用这样的类映射的用户集合:

class User
{
  public String Id { get; set; }
  ...
}
Run Code Online (Sandbox Code Playgroud)

Id 属性是文档的标识符;它在 C# 中由一个字符串表示,但在 mongo 中是一个 objectid。以下映射允许确保这一点:

BsonClassMap.RegisterClassMap<User>(cm =>
{
  cm.MapIdProperty(x => x.Id)
    .SetSerializer(new StringSerializer(BsonType.ObjectId))
    .SetIdGenerator(StringObjectIdGenerator.Instance);
  ...
}
Run Code Online (Sandbox Code Playgroud)

我有另一个名为 Book 的集合;每本书都可以由一个或多个作者撰写。

class Book
{
  public String Id { get; set; }
  public String Title { get; set; }
  public IList<String> Authors { get; set; }
  ...
}
Run Code Online (Sandbox Code Playgroud)

Id 属性与 User 集合的相同。我希望每个作者都作为 objectid 而不是 string 存储在 mongo 中:但我不知道该怎么做:我不想定义 autors 属性的序列化程序,而是定义该属性的每个元素的序列化程序。

BsonClassMap.RegisterClassMap<Book>(cm =>
{
  cm.MapIdProperty(x => x.Id) …
Run Code Online (Sandbox Code Playgroud)

c# mongodb mongodb-.net-driver

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

从 MongodbC# 读取特定字段值

最近我开始使用 MongoDB。我必须使用 mongodb C# 驱动程序从 mongodb 读取特定字段(列)。这意味着无论值如何,我都必须读取特定字段。我只需要指定字段。我的数据中有非结构化数据db.so 我的项目中没有模型类。

我使用 Getcollection<> 从 C# 库中读取 Collection。然后在我坚持完成这项任务之后。

我怎样才能实现?

mongodb mongodb-query mongodb-csharp-2.0 mongodb-.net-driver

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

使用 C# 驱动程序在嵌套的 mongo 集合中添加新对象

我想Mongo使用在嵌套集合中添加一个新对象C# drivers,请在下面的示例 json 中找到。

我有类似下面的称为学生的集合。

{
    "_id" : ObjectId("5a866be6f843b648a0bac9ab"),
    "FIstName" : "Bob",
    "LastName" : "mark", 
    "MarkList" : [ 
        {
            "SUbject" : "science",
            "Mark" : "80",
            "Rank" : "10",

        }
    ],

}
Run Code Online (Sandbox Code Playgroud)

现在我想使用 C# 驱动程序在 Marklist 数组下插入一个新的主题对象,

    {
        "SUbject" : "Physics",
        "Mark" : "80",
        "Rank" : "10",

    }
Run Code Online (Sandbox Code Playgroud)

我还为上述属性创建了类。

请提出一些想法。

提前致谢

mongodb mongodb-.net-driver

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

如何从 C# Mongodb 强类型驱动程序中的文档加载特定字段

我使用官方 C# MongoDb 强类型驱动程序版本 2.5.0 与 MongoDB 交互。

我有类 Book 和 Page 如下:

public class Book
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }

    public string Title { get; set; }

    public string AuthorName { get; set; }

    public int PublishYear { get; set; }

    public List<Page> Pages { get; set; } = new List<Page>();

}


public class Page
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }

    public int Number { get; set; }

    public string …
Run Code Online (Sandbox Code Playgroud)

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

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

MongoDB C# 查找 List&lt;string&gt; 包含另一个 List&lt;string&gt; 值的文档

在我的 mongoDB 中创建过滤功能的过程中,我使用 c# 的 mongoDB 驱动程序创建了以下查找查询。

return await DefaultCollection
                .Find(c => c.vintageInfo.IsVintage
                           && c.IsPublished
                           && c.AverageRating >= lowerRating
                           && filterArray1.Contains(c.filterSearchParameters.Dosage))       
                .Skip(page * pageSize)
                .Limit(pageSize)
                .ToListAsync();
Run Code Online (Sandbox Code Playgroud)

这工作完美,一切都很棒!

现在正如我们在上面的例子中看到的,我可以检查提供的 filterArray1 是否包含文档属性 c.filterSearchParameters.Dosage。现在问题出现的原因,该文件进一步包含一个列表如下c.filterSearchParameters.Styles。我希望能够做的是检查列表 c.filterSearchParameters.Styles 是否包含任何匹配 filterArray2 的值​​。

编辑

按要求:

filterSearchParameters 看起来像:

public class FilterSearchParameters
    {
        public string Dosage { get; set; }
        public List<string> Style { get; set; }
        public List<string> Character { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

而 filterArray1 和 2 只是一个普通的:

List<string> filterArray1
List<string> filterArray2
Run Code Online (Sandbox Code Playgroud)

为此,我尝试过:

return await DefaultCollection
                .Find(c => …
Run Code Online (Sandbox Code Playgroud)

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

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

Mongodb C# 查询排序超出了内存限制

我有 2 周的时间学习和使用 MongoDB,我正在使用 DataGridview 构建一个简单的 WinForm 应用程序。

一切正常,但我添加了超过 1.000.000 个文档,现在它显示了这个错误:

MongoDB.Driver.MongoCommandException: '命令聚合失败:排序超出了 104857600 字节的内存限制,但没有选择外部排序。中止操作。通过 allowDiskUse:true 选择加入..

我整个周末都在谷歌上检查了如何使用 Aggreate allowDiskUse:true 但它也不起作用。

谢谢。

public void ReadAllDocuments()
{
    List<Clientes> list = collection.AsQueryable().OrderBy(q => q.Nombre).ToList();

    dataGridView1.DataSource = list;
    if (dataGridView1.Rows.Count > 0)
    {
        textBox1.Text = dataGridView1.Rows[0].Cells[0].Value.ToString();
        textBox2.Text = dataGridView1.Rows[0].Cells[1].Value.ToString();
        textBox3.Text = dataGridView1.Rows[0].Cells[2].Value.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

元素“id”与嵌套类的任何字段或错误属性都不匹配

我有以下 mongodb 文档架构;

{ 
    "_id" : ObjectId("5c9d34ff781318afb9e8ab43"), 
    "name" : "Name", 
    "slug" : "slug",
    "services" : {
        "subservice" : {
            "id" : NumberInt(37030)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我将我的课程定义为;

public class MainModel
{
    public ObjectId Id { get; set; }

    [BsonElement("name")]
    public string Name { get; set; }

    [BsonElement("slug")]
    public string Slug { get; set; }

    [BsonElement("services")]
    public ServicesDef Services { get; set; }

    public class ServicesDef 
    {
        [BsonElement("subservice")]
        public SubServiceDef SubService{ get; set; }

        public class SubServiceDef 
        {
            [BsonElement("id")]
            public int Id …
Run Code Online (Sandbox Code Playgroud)

c# mongodb mongodb-.net-driver

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

无法在 MongoDB .NET 驱动程序中将“MongoDB.Bson.BsonString”类型的对象转换为“MongoDB.Bson.BsonDocument”类型

我在尝试使用 MongoDB .NET 客户端运行聚合管道时遇到问题。我的代码看起来像这样:

    public async Task<IEnumerable<string>> GetPopularTags(int count)
    {
        var events = _database.GetCollection<Event>(_eventsCollectionName);

        var agg = events.Aggregate();
        var unwind = agg.Unwind<Event, Event>(e => e.Tags);
        var group = unwind.Group(e => e.Tags, v => new { Tag = v.Key, Count = v.Count() });
        var sort = group.SortByDescending(e => e.Count);
        var project = group.Project(r => r.Tag);
        var limit = project.Limit(count);
        var result = await limit.SingleOrDefaultAsync();

        return result;
    }
Run Code Online (Sandbox Code Playgroud)

(每个阶段的单独变量仅用于调试目的)

在尝试获取管道结果(最后一个变量)时,出现以下错误:

System.InvalidCastException:无法将“MongoDB.Bson.BsonString”类型的对象转换为“MongoDB.Bson.BsonDocument”类型

我错过了什么?

在此先感谢您的帮助!

解决方案

我终于发现,我在最后一行出现异常与错误所在的位置无关。我尝试.SingleOrDefault()在每个阶段运行以查看输出,我注意到我的管道有几个问题。

  1. 我的展开阶段试图返回一个Event对象,但由于它是展开Tags属性(这是 …

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

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

DeleteManyAsync 会在删除文档时锁定 MongoDB 集合吗?

我想使用DeleteManyAsync方法删除多个文档。我会遇到大集合被删除的情况。同时,我希望插入我的新文件。我想知道当 DeleteManyAsync 被触发时我的数据库集合是否会被锁定

这是我想使用的代码:

 List<MyDocument> list= new List<MyDocument>();
 var filter = Builders<MyDocument>.Filter.In("_id", vl.Select(i => i.InternalId));
 await _context?.MyDocuments?.DeleteManyAsync(filter);
Run Code Online (Sandbox Code Playgroud)

c# mongodb mongodb-.net-driver

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

MongoCollectionSettings.GuidRepresentation 已过时,有什么替代方案?

我正在使用 MongoDB.Driver 2.11.0 和 .Net Standard 2.1。为了确保数据库存在并且集合存在,我有以下代码:

IMongoClient client = ...; // inject a Mongo client

MongoDatabaseSettings dbSettings = new MongoDatabaseSettings();
IMongoDatabase db = client.GetDatabase("MyDatabase", dbSettings);

MongoCollectionSettings collectionSettings = new MongoCollectionSettings()
{
    GuidRepresentation = GuidRepresentation.Standard,
};
IMongoCollection<MyClass> collection = db.GetCollection<MyClass>("MyClasses", collectionSettings);
Run Code Online (Sandbox Code Playgroud)

在早期版本的 MongoDB.Driver 中,此代码将在没有任何警告的情况下编译。在 v2.11.0 中,我现在收到一条警告,指出“MongoCollectionSettings.GuidRepresentation 已过时:改为配置序列化程序”,但我找不到任何示例来说明设置 Guid 序列化格式的新方法。有谁知道为集合设置序列化程序的其他方法?

c# mongodb mongodb-.net-driver

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