我有一个 MongoDB 集合(“Users”),其中包含一个字典字段(“UserRegistrations”)。
字段定义为:
BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)]
public Dictionary<string, UserRegistration> UserRegistrations = new Dictionary<string, UserRegistration>();
它是一个字典,由一个键(字符串)和一个自定义对象作为值组成。
这是它在 MongoDB 中的反射(reflect)方式:
"UserRegistrations" : [{
"k" : "517ba4e1696b03108ccef51a",
"v" : {
"RegistrationDate" : ISODate("2013-07-21T18:57:42.589Z"),
"OtherInfo" : "123456test",
}
}],
当我使用$AddToSet时,如下例:
IMongoQuery query = Query.EQ("_id", new ObjectId(uid));
var kvp = new KeyValuePair<string, UserRegistration>("517ba4e1696b03108ccef51a", new UserRegistration()
{
RegistrationDate = DateTime.Now.ToUniversalTime(),
});
IMongoUpdate update = Update.AddToSet("UserRegistrations", kvp.ToBsonDocument());
collection.Update(query, update, UpdateFlags.Multi);
它不检查相同的键是否已经存在,导致字典字段中的重复,随后导致 MongoDB C# 驱动程序中的反序列化错误。
如何确保相同的 key 不存在?
谢谢!
最佳答案
在您的模式的当前状态下,我认为仅使用一个对 mongodb 的更新查询不可能实现您正在尝试的目标。
你有两个选择(也许还有更多我没想到的)
<强>1。在您的程序上编辑文档
不仅仅是用您想要附加的键值更新您的文档,
这种方法确实很慢(与直接更新相比),但这是在不更改模式的情况下完成您所要求的唯一方法。
<强>2。更改架构
为每个键值对创建一个单独的集合(名称为“UserRegistrations”以便于理解)和(我猜测包含数组“UserRegistrations”的对象还有一些其他字段,如 UserID 或类似的东西)创建键值对中 UserID 和键的唯一索引复合索引。
该集合中的记录如下所示:
{
"UserID" : "unique_user_id_of_user_A"
"k" : "517ba4e1696b03108ccef51a",
"v" : {
"RegistrationDate" : ISODate("2013-07-21T18:57:42.589Z"),
"OtherInfo" : "123456test",
}
}
{
"UserID" : "unique_user_id_of_user_B"
"k" : "jkfadifhafo4ho34fo78h34fo7", #obvious keyboard spazzing here
"v" : {
"RegistrationDate" : ISODate("2013-07-21T19:57:42.589Z"),
"OtherInfo" : "123456test",
}
}
{
"UserID" : "unique_user_id_of_user_A" #same user as first record
"k" : "sfahoihu43o43f7437843f8g348", #different key-value pair
"v" : {
"RegistrationDate" : ISODate("2013-07-22T18:57:42.589Z"),
"OtherInfo" : "123456test",
}
}
优点:您不再需要担心每个文档的 16MB 限制,每个用户几乎可以拥有无限的“UserRegistrations”(无论它们是什么)。
缺点:您必须执行连接,使用索引可能会很快,但在使用 mongodb 时,您应该尽量避免它们。
这只是我为您的问题想出的一个快速解决方案。如果您有兴趣,您应该研究如何构建您的架构。 MongoDb data modelling manual 和 this question 应该可以帮助您入门。
强>强>关于c# - $AddToSet 到字典(MongoDB、C#)重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19378971/
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立
这就是我做的a="%span.rockets#diamonds.ribbons.forever"a=a.match(/(^\%\w+)([\.|\#]\w+)+/)putsa.inspect这是我得到的#这就是我想要的#帮助?我尝试过但失败了:( 最佳答案 通常,您不能获得任意数量的捕获组,但如果您使用扫描,您可以为您想要捕获的每个标记获得一个匹配:a="%span.rockets#diamonds.ribbons.forever"a=a.scan(/^%\w+|\G[.|#]\w+/)putsa.inspect["%span","
我正在处理一些作为Ruby哈希字符串返回的命令输出。(来自名为mcollective的东西)。这是我收到的示例字符串:{:changes=>{"total"=>0},:events=>{"failure"=>0,"success"=>0,"total"=>0},:version=>{"puppet"=>"2.7.21(PuppetEnterprise2.8.1)","config"=>1381497648},:time=>{"filebucket"=>0.000287,"cron"=>0.00212,"package"=>0.398982,"exec"=>0.001314,"confi
我无法使用传统的Ruby方法从下面的数组user_list中删除所有重复对象,从而获得预期的结果。有解决这个问题的聪明方法吗?users=[]user_list.eachdo|u|user=User.find_by_id(u.user_id)users 最佳答案 这个怎么样?users=User.find(user_list.map(&:user_id).uniq)这具有作为一个数据库调用而不是user_list.size数据库调用的额外好处。 关于Ruby从数组中删除重复的对象,我们在
我如何做Ruby方法"Flatten"RubyMethod在C#中。此方法将锯齿状数组展平为一维数组。例如:s=[1,2,3]#=>[1,2,3]t=[4,5,6,[7,8]]#=>[4,5,6,[7,8]]a=[s,t,9,10]#=>[[1,2,3],[4,5,6,[7,8]],9,10]a.flatten#=>[1,2,3,4,5,6,7,8,9,10 最佳答案 递归解决方案:IEnumerableFlatten(IEnumerablearray){foreach(variteminarray){if(itemisIEnume
ruby中有没有一个很好的方法来删除可枚举列表中的重复项(即拒绝等) 最佳答案 对于数组你可以使用uniq()方法a=["a","a","b","b","c"]a.uniq#=>["a","b","c"]所以如果你只是(1..10).to_a.uniq或%w{antbatcatant}.to_a.uniq因为无论如何,几乎所有您实现的方法都将作为Array类返回。 关于Ruby删除可枚举列表中的重复项,我们在StackOverflow上找到一个类似的问题: h
我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用