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

MongoDB查询-限制名称与模式匹配的字段,mongodb,pymongo,Mongodb,Pymongo,我已经阅读了所有关于MongoDB中投影的内容。我希望这很简单,但由于Mongo查询的巨大灵活性,我错过了它 在我们的MySql数据库中,我们采用了一种业务实践,即在“隐藏”字段前面加下划线。我们的应用程序知道如何隐藏这些字段 将一些数据移动到mongo,我需要检索文档,并省略所有带下划线前缀的字段。当然,这应该在查询中完成,而不是在检索后进行文档操作 所有的操作符,比如$regex、$in$,似乎都适用于值。我需要构建一个投影,该投影忽略基于名称的未知数量的字段。比如: db.coll.fin

我已经阅读了所有关于MongoDB中投影的内容。我希望这很简单,但由于Mongo查询的巨大灵活性,我错过了它

在我们的MySql数据库中,我们采用了一种业务实践,即在“隐藏”字段前面加下划线。我们的应用程序知道如何隐藏这些字段

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

所有的操作符,比如$regex、$in$,似乎都适用于值。我需要构建一个投影,该投影忽略基于名称的未知数量的字段。比如:

db.coll.find({}, {"_*": 0})
当然,这不起作用,但解释了这个想法

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


希望这很容易…

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

目前最好的方法是设置一个键值存储,如:

{
    fields: [
        {k: "_ghhg", v: 5},
        {k: "ghg", v: 6}
    ]
}
然后在
k
字段上
$regex
,了解哪些键名(字段)中有下划线

作为一条建议,我强烈建议使用前缀
$regex
s,因为它们在使用您创建的索引时更加有效,例如,对于您显示的查询:
^.*

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


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

您可以有一个单独的字段作为
隐藏的\u字段
或其他什么。请参见以下模式

{_id: 'myid1', hidden_fields: {"_foo": "bar", "_foo2": "bar2"}, key1: value1 ...}
现在,在上述模式的基础上

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

这将显示隐藏字段。此外,您还可以在子文档中的字段上建立索引,这样就不会损失性能。

正如@Sammaye所提到的,MongoDB不以自然/高效的方式支持这种类型的查询

<>但是,为了优化性能,如果你不总是需要内部数据,我建议你考虑创建两个文档,一个是总是可用的数据,一个是“y-内”字段。MongoDB将读写更少,并且在客户端上可以操作的更少。这类似于在RDBMS中有两个表(一个带有公共数据,一个带有私有数据)

这可以通过只更新整个文档(如果在您的场景中可能的话)来简化对非内部数据的更新


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

所有的回复都很好,帮助我理解了我设计中固有的缺陷。我已经实现了与Sushant建议相反的功能——我所有的文档在根级别都有一个固定的模式和一个“内容”节点。我将只向我的用户展示内容节点,从而保护文档的所有其他部分。