我一直在 C# 中使用 MongoDB,并且一直使用 ObjectId,后来又使用 GUID 作为我的实体 Id。我讨厌查看这些 Id,我认为这是违反直觉的...我真的很希望能够使用整数或长整型,例如关系数据库的 Identity 列。但我很难找到一种方法来做到这一点。如果我使用集合 max + 1,这将导致竞争条件。我读过有关使用 Hi-Lo 生成器算法的内容,但它是如何工作的呢?如果我有 10 个应用程序服务器运行相同的代码怎么办?这是否意味着每个集合必须有 10 个 hi lo 身份范围?
如果有人可以向我指出一个 C# 算法来分享,那就太好了!顺便说一下,我见过 RNGCryptoServiceProvider,但不能保证它是唯一的,而且它不是一个连续的 int/long Identity。那时我宁愿使用 Hi-Lo...
谢谢,蒂姆
考虑两个类:
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 …
这是我的实体:
{
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 新手。我正在尝试检索查找集合中的所有条目。我收到以下错误:
{“反序列化 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)
谁能帮我找出问题所在吗?任何帮助将不胜感激。
谢谢!
这意味着将被读取为双重更新插入操作,首先更新插入文档,然后更新插入数组元素。
所以 MongoDB 对我来说是一个非规范化的存储(我们是事件源的),我试图处理的事情之一就是它的并发性。问题是这样的:
例如:
如果可能的话,让它作为单个原子操作执行将是理想的,但如果它只能通过多个步骤完成,那就这样吧。由于 2.x 驱动程序发生了巨大变化,我在网上得到了许多混合示例。不确定除了 UpdateOneAsync 之外我还在寻找什么。目前使用 2.4.x。解释的例子将不胜感激。TIA
注意:重申这是关于 MongoDB C# 驱动程序 2.4.x 的问题
我使用 Mongodb 3.6 + .net 驱动程序 (MongoDb.Driver 2.10) 来管理我们的数据。最近,我们注意到我们的服务(后台)消耗了大量内存。分析转储后,发现有一个名为 BsonChunkPool 的 mongo 对象始终消耗大约 0.5 GB 的内存。正常吗?我真的找不到任何关于这种类型及其实际用途的有价值的文档。有人可以帮忙吗?
当尝试将类型化文档投影到不同的类中时,我得到以下信息:在表达式树 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) 我有这个查询在 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#驱动程序创建以下文档?
{
"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)
谢谢.
我的数据库中有一个"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)