MongoDB查询 - 限制名称与模式匹配的字段

时间:2012-12-12 21:28:00

标签: mongodb pymongo

我已经阅读了有关MongoDB中投影的所有内容。我希望这很简单,我只是错过了它,因为Mongo查询具有极大的灵活性。

在我们的MySql数据库中,我们采用了一种商业惯例,即“隐藏”字段以下划线为前缀。我们的应用程序知道如何隐藏这些字段。

将一些数据移动到mongo,我需要检索文档,使用省略的所有下划线前缀字段。当然,这应该在查询中完成,而不是在检索后进行文档操作。

$ regex,$ in,$ all等所有运营商似乎都适用于。我需要构建一个基于名称忽略未知数量字段的投影。类似的东西:

db.coll.find({}, {"_*": 0})

当然这不起作用,但解释了这个想法。

我应该注意:这是必要的,因为我们的应用程序用户可以编辑文档,因此我不知道架构可能是什么样子。我知道我们的“内部”字段以_为前缀,那些需要通过编辑器的省略来保护。

希望这很容易......

3 个答案:

答案 0 :(得分:1)

您可以将单独的字段设为hidden_fields或其他字段。请参阅以下架构。

{_id: 'myid1', hidden_fields: {"_foo": "bar", "_foo2": "bar2"}, key1: value1 ...}

现在基于上面的架构,只需做,

db.collection.find({ ... }, {hidden_fields: 1})

这将显示隐藏的字段。您还可以在子文档中的字段上设置索引,这样也不会损失性能。

答案 1 :(得分:0)

由于充分的理由,没有这方面的功能。实现这种功能将是一场噩梦,它不会扩展,也不会很快。

目前执行此操作的最佳方法是设置键值存储,如:

{
    fields: [
        {k: "_ghhg", v: 5},
        {k: "ghg", v: 6}
    ]
}

然后,您可以在$regex字段k上了解哪些关键名称(字段)在其中有下划线。

作为一条建议,我强烈推荐使用前缀$regex,因为它们更有效地使用您创建的索引,即您显示的查询:^_*

  

将一些数据移动到mongo,我需要检索文档,省略所有下划线前缀字段。当然,这应该在查询中完成,而不是在检索后进行文档操作。

我个人会做这个客户端,它比数据库端快100倍。

答案 2 :(得分:0)

正如@Sammaye所提到的,MongoDB不支持这种类型的查询。

但是,如果您不总是需要内部数据来优化性能,我建议您考虑创建两个文档,一个包含始终可用的数据,另一个只包含“_internal”字段。 MongoDB将更少读写,并且在客户端上操作的次数会减少。这类似于在RDBMS中有两个表(一个包含public,一个包含私有数据)。

通过更新整个文档(如果可能,在您的方案中),这可以简化非内部数据的更新。

当然,您也可以删除额外的“_”字符,因为这只会为BSON数据添加额外的不必要字符。 :)