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

时间:2013-04-17 13:43:25

标签: mongodb mongo-java

当确定要返回的字段(collection.find(q, fields))时,mongoDB支持比较字段名称(而不是值)吗?

E.g。根据名称选择一系列字段而不考虑其价值。

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

fieldA000 fieldA001 fieldA002 fieldB000 fieldB001 fieldC000 ...

我希望限制匹配fieldA000 to fieldA999的任何字段名称的返回字段(无需明确定义任何字段名称)或fieldA.*(reg ex)或类似名称。

P.S。:我目前正在评估是否可以使用mongoDB而不是Cassandra,其中以一种非常容易使用的方式提供列范围/切片选择。

2 个答案:

答案 0 :(得分:3)

Mongo没有办法在关键名称上使用正则表达式来匹配文档。

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

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

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

{
    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' },
    ]
}

答案 1 :(得分:0)

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

您不能根据模式添加或排除字段。你可以做的是标记要包括的字段:

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

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

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

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

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

有关详细信息,请参阅this link

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