使用 MongoDB 官方 C# 驱动程序进行按位枚举(标志)查询

2024-04-06

当我尝试运行以下形式的 LINQ 查询时:

MongoCollection<MyEntity> collection;

collection.AsQueryable().Where(entity =>
    (entity.Flags & MyFlags.AFlag) != MyFlags.None);

我得到一个ArgumentException与消息Unsupported where clause: ((Int32)((Int32)entity.Flags & 4) != 0).

这是一个已知的错误/功能吗?

有什么解决方法吗?

来自文档 http://docs.mongodb.org/manual/reference/operator/MongoDB 似乎有按位更新,但没有按位查询。

为了进行比较,使用 ServiceStack 作为客户端,相同的查询在 Redis 上运行顺利。

我确实找到了这两个链接(link1 http://misaxionsoftware.wordpress.com/2011/09/19/mongodb-bitwise-filtering-faster-status-querying-performance/, link2 http://grokbase.com/t/gg/mongodb-user/12247pc2d6/bitwise-operations-while-querying)建议使用 JavaScript,但是,这会使服务层的实现非常依赖于 DB 技术。


从 MongoDB v 3.2 开始,您可以使用位全部设置 https://docs.mongodb.com/manual/reference/operator/query/bitsAllSet/ or 位任意集 https://docs.mongodb.com/manual/reference/operator/query/bitsAnySet/取决于您要搜索的内容。

因此,使用 C# MongoDB 驱动程序:

//Check single Flag as OP
collection.Find(Builders<MyEntity>.Filter.BitsAllSet(myEntity => myEntity.Flags, (long) MyFlags.AFlag));

//Check all multiple Flags
collection.Find(Builders<MyEntity>.Filter.BitsAllSet(myEntity => myEntity.Flags, (long) MyFlags.AFlag | MyFlags.BFlag));

//Check any multiple Flag
collection.Find(Builders<MyEntity>.Filter.BitsAnySet(myEntity => myEntity.Flags, (long) MyFlags.AFlag | MyFlags.BFlag));

Note: 有一个开放问题 https://jira.mongodb.org/browse/SERVER-24749在按位运算中使用索引。在 MongoDB 4.2 上,它们仍然不使用它们,所以如果您打算大量使用它们,请注意(我们曾经并且之后必须重构所有内容)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 MongoDB 官方 C# 驱动程序进行按位枚举(标志)查询 的相关文章

随机推荐