我已经阅读了有关MongoDB中投影的所有内容。我希望这很简单,我只是错过了它,因为Mongo查询具有极大的灵活性。
在我们的MySql数据库中,我们采用了一种商业惯例,即“隐藏”字段以下划线为前缀。我们的应用程序知道如何隐藏这些字段。
将一些数据移动到mongo,我需要检索文档,使用省略的所有下划线前缀字段。当然,这应该在查询中完成,而不是在检索后进行文档操作。
$ regex,$ in,$ all等所有运营商似乎都适用于值。我需要构建一个基于名称忽略未知数量字段的投影。类似的东西:
db.coll.find({}, {"_*": 0})
当然这不起作用,但解释了这个想法。
我应该注意:这是必要的,因为我们的应用程序用户可以编辑文档,因此我不知道架构可能是什么样子。我知道我们的“内部”字段以_为前缀,那些需要通过编辑器的省略来保护。
希望这很容易......
答案 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数据添加额外的不必要字符。 :)