4

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

例如,根据名称选择一系列字段,而不考虑它们的值。

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

fieldA000 fieldA001 fieldA002 fieldB000 fieldB001 fieldC000 ...

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

PS:我目前正在评估我们是否可以使用 mongoDB 代替 Cassandra,其中以非常易于使用的方式提供 column-range/slice-select。

4

2 回答 2

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' },
    ]
}
于 2013-04-17T14:00:02.420 回答
0

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

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

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

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

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

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

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

有关更多信息,请参阅此链接

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

于 2013-04-17T14:40:45.903 回答