c# - 使用 C# MongoDB 驱动程序在 for 循环中创建过滤器的布尔逻辑
问题描述
所以,我正在尝试在 C# 中实现以下 mongoDB 过滤器:
find({ "$or" : [
{"$and":[{ "isPublic" : false}, {"_id" : ObjectId("60c0bfc23b3ffd14f2675104")}]},
{"$and":[{ "isPublic" : false}, {"_id" : ObjectId("60c0bfe43b3ffd14f2675105")}]},
{"$and":[{ "isPublic" : false}, {"_id" : ObjectId("60c0c1863b3ffd14f2675106")}]}]
});
上述过滤器需要在 for 循环中创建,因为嵌套的“和”的数量可能会有所不同。
使用https://stackoverflow.com/a/32253436/16185277的公认答案,我尝试了以下操作:
FilterDefinition<documents.poses> idFilter;
FilterDefinition<documents.poses> isPublicFilter = Builders<documents.poses>.Filter.Eq(x => x.isPublic, false);
posesFilter = Builders<documents.poses>.Filter.Empty;
foreach (ObjectId _id in DBManager.loggedInUser.poses){
idFilter = Builders<documents.poses>.Filter.Eq(x => x._id, _id);
posesFilter |= isPublicFilter & idFilter;
}
这段代码创建的过滤器是:
find({ "$or" : [{ },
{ "isPublic" : false, "_id" : ObjectId("60c0bfc23b3ffd14f2675104") },
{ "isPublic" : false, "_id" : ObjectId("60c0bfe43b3ffd14f2675105") },
{ "isPublic" : false, "_id" : ObjectId("60c0c1863b3ffd14f2675106") }] })
我还尝试了以下方法,它创建了与上面完全相同的过滤器。
FilterDefinition<documents.poses> idPublicFilter;
FilterDefinition<documents.poses> isPublicFilter = Builders<documents.poses>.Filter.Eq(x => x.isPublic, false);
posesFilter = Builders<documents.poses>.Filter.Empty;
foreach (ObjectId _id in DBManager.loggedInUser.poses){
idPublicFilter = Builders<documents.poses>.Filter.Where(x => x._id == _id && x.isPublic == false);
posesFilter = Builders<documents.poses>.Filter.Or(idPublicFilter, posesFilter);
}
任何帮助将非常感激。
解决方案
我建议使用看起来像的 in 子句
FilterDefinitionBuilder<Poses> filter = new();
var ids = poses.Select(p => p.ID);
var f = filter.And(
filter.Eq(f => f.isPublic, false),
filter.In(f => f.ID, ids)
);
失败将构建一个可枚举的过滤器,然后在 or 子句中组合
List<FilterDefinition<Poses>> filters = new();
foreach (var item in poses)
{
filters.Add(filter.And(
filter.Eq(f => f.isPublic, false),
filter.Eq(f => f.ID, item.ID)
));
}
var f = filter.Or(filters.ToArray());
推荐阅读
- javascript - 如何确保用户将正确的数据发送到 firebase callabe 函数?
- reactjs - 如何在 React.js 应用程序中将字符串中的特定文本加粗
- c# - Selenium c#:如何从 WebDriverWait().Until() 中的函数中捕获异常
- javascript - 我们可以在 JS 文件中使用 i18n 变量吗?
- javascript - 图像滑块 - 如何检查元素是否部分超出父 div 水平
- javascript - 在反应 js 中从过滤后的地图创建一个新数组
- asp.net-core - 如何处理 IHostBuilder CreateHostBuilder 的异常
- ios - 在 iOS 上使用 Cordova 的闪屏时出现黑条
- python - 在 tkinter 中有没有办法绘制平滑的曲线?
- php - 贝宝沙盒电子邮件通知