mongoDB可以比较字段名而不是字段值吗?

mongoDB可以比较字段名而不是字段值吗?,mongodb,mongo-java,Mongodb,Mongo Java,定义要返回的字段(collection.find(q,fields))时,mongoDB(如何)支持比较字段名(而不是值) 例如,根据字段名称选择一系列字段,而不考虑其值 假设文档中有以下字段(无论值是什么): fieldA000 fieldA001 fieldA002 fieldB000 fieldB001 fieldC000 ... 我想限制任何字段名的返回字段,这些字段名匹配fieldA000到fieldA999(无需明确定义任何字段名)或fieldA.*(reg-ex)或类似内容 注:

定义要返回的字段
(collection.find(q,fields))
时,mongoDB(如何)支持比较字段名(而不是值)

例如,根据字段名称选择一系列字段,而不考虑其值

假设文档中有以下字段(无论值是什么):

fieldA000 fieldA001 fieldA002 fieldB000 fieldB001 fieldC000 ...
我想限制任何字段名的返回字段,这些字段名匹配
fieldA000到fieldA999
(无需明确定义任何字段名)或
fieldA.*
(reg-ex)或类似内容


注:我目前正在评估是否可以使用mongoDB而不是Cassandra,因为Cassandra以一种非常易于使用的方式提供了列范围/切片选择。

Mongo无法使用regex的键名匹配文档

但是,您可以使用执行JavaScript来选择每个文档。
$where
的缺点是它不能利用索引,因此需要对集合中的每个文档进行反序列化,这对于大多数应用程序来说可能太慢

在Mongo中执行此操作的另一种方法是使用
$exists
$or
,但它需要显式的键名

对于这种类型的查询,这样的模式会更有效,并且还可以使用以下方法在服务器上进行切片:

或:


MongoDB允许您在每个查询操作上提供一个投影,它指定要返回哪些字段

不能基于模式包含或排除字段。您可以做的是标记要包括的字段:

db.foo.find({},{'A000':1,'A001':1,'B000':1})

(此查询将返回_id、A000、A001和B000字段)

或者,标记要排除的特定字段:

db.foo.find({},{'B000':0})

(此查询将返回除B000以外的所有字段)

有关更多信息,请参阅


一般来说,使用这样的投影来模拟列切片对于文档数据库来说并不是一个很好的用例-虽然数据不会从db服务器返回到客户端(节省网络和客户端解析开销),但它仍然会从磁盘读取(除非可以使用覆盖索引返回所有字段),并且必须对文档进行分析,以确定要排除哪些部分。

顺便说一句:通过在字段字母和数据字段数组的数量上创建索引,可以大大提高循环速度。非常感谢。我希望我不需要生成一个不同的结构(与我们在Cassandra上使用的结构不同)。这与问题有什么关系?@Sammaye:“我想限制任何匹配fieldA000到fieldA999的字段名的返回字段”-我将此理解为一个关于如何限制返回结果的字段的问题,而不是关于如何筛选返回的文档。你不同意吗?事实上,它确实会投射出一定数量的字段,但是他不确定有多少个字段,因此他希望使用正则表达式来投射与某个范围匹配的所有字段,他的问题可能也会简化。换句话说,这是行不通的。投影也可以使用indexProjection可以(也将)使用索引。但是,除非索引完全覆盖了投影,否则IO将不会被保存,这在返回大量字段的情况下是不可能的。我在答案中加了这个。
{
    dataFields: [
        { id: 'A000', value: 'whatevs' },
        { id: 'A001', value: 'whatevs' },
        { id: 'A002', value: 'whatevs' },
        { id: 'B000', value: 'whatevs' },
        { id: 'B001', value: 'whatevs' },
        { id: 'C000', value: 'whatevs' },
    ]
}
{
    dataFields: [
        { lettter: 'A', number: 0, value: 'whatevs' },
        { lettter: 'A', number: 1, value: 'whatevs' },
        { lettter: 'A', number: 2, value: 'whatevs' },
        { lettter: 'B', number: 0, value: 'whatevs' },
        { lettter: 'B', number: 1, value: 'whatevs' },
        { lettter: 'C', number: 0, value: 'whatevs' },
    ]
}