我有一个用这样的类映射的用户集合:
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) 最近我开始使用 MongoDB。我必须使用 mongodb C# 驱动程序从 mongodb 读取特定字段(列)。这意味着无论值如何,我都必须读取特定字段。我只需要指定字段。我的数据中有非结构化数据db.so 我的项目中没有模型类。
我使用 Getcollection<> 从 C# 库中读取 Collection。然后在我坚持完成这项任务之后。
我怎样才能实现?
mongodb mongodb-query mongodb-csharp-2.0 mongodb-.net-driver
我想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)
我还为上述属性创建了类。
请提出一些想法。
提前致谢
我使用官方 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) 在我的 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) 我有 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) 我有以下 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) 我在尝试使用 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()在每个阶段运行以查看输出,我注意到我的管道有几个问题。
我的展开阶段试图返回一个Event对象,但由于它是展开Tags属性(这是 …
我想使用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) 我正在使用 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 序列化格式的新方法。有谁知道为集合设置序列化程序的其他方法?