Ori*_*ael 6 c# mongodb mongodb-.net-driver
我想更新一个只包含一些Id的集合和一个objectId的字典到objectId.
public class ME_BlaBla
{
[BsonId]
public ObjectId MyId;
public Dictionary<ObjectId, ObjectId> IdsToOtherIds;
}
Run Code Online (Sandbox Code Playgroud)
对不起,如果我的名字没有提供信息,我无法分享实际代码=.
现在,我有这个问题:
var filter = Builders<ME_BlaBla>.Filter.And(
Builders<ME_BlaBla>.Filter.Eq(t => t.MyId, id),
Builders<ME_BlaBla>.Filter.Not(Builders<ME_BlaBla>.Filter.Exists(t => t.IdsToOtherIds.Values, valueId)),
Builders<ME_BlaBla>.Filter.Not(Builders<ME_BlaBla>.Filter.Exists(t => t.IdsToOtherIds.Keys, keyId)));
Run Code Online (Sandbox Code Playgroud)
所以,我试图按MyId字段过滤,但当我想在那里插入数据时我不想复制任何种类,不在Keys也不在Values
整个想法是更新必须是原子的,并检查字典中是否包含所提供的ID.
我仍然试图了解如何在Exists这里使用过滤器,所以它可能是答案.
TIA.
编辑
我将代码更改为类似的东西:(仍然不确定它的工作正常...无法测试它atm)
Builders<ME_BlaBla>.Filter.Not(Builders<ME_BlaBla>.Filter.ElemMatch(t => t.IdsToOtherIds, a => a.Key == keyId)),
Builders<ME_BlaBla>.Filter.Not(Builders<ME_BlaBla>.Filter.ElemMatch(t => t.IdsToOtherIds, a => a.Value == valueId)));
Run Code Online (Sandbox Code Playgroud)
Builders<ME_BlaBla>.Filter.Not(Builders<ME_BlaBla>.Filter.Exists(t => t.IdsToOtherIds.Values, valueId))
Run Code Online (Sandbox Code Playgroud)
这部分代码不会检查字段的属性(这是 type 的元素列表)valueId中是否存在值(我猜这就是您的意思)。检查文档是否包含特定字段;您可以检查您收藏的文档是否有“字典”或“姓氏”字段。ValuesObjectIdDictionaryExists
如果您在应用程序中需要一个唯一的值,您是否可以在某个地方创建一个单例类,它将生成特定序列的下一个(因此是唯一的)值?
您Dictionary可能被序列化为文档数组,因此如果您需要检查文档是否已存在于集合中,您需要使用AnyIn(或其他)而不是Exists.
| 归档时间: |
|
| 查看次数: |
1217 次 |
| 最近记录: |