3

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

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

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

$regex、$in、$all 等所有运算符似乎都适用于values。我需要构建一个基于名称忽略未知数量字段的投影。就像是:

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

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

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

希望这很容易...

4

3 回答 3

1

你可以有一个单独的字段作为hidden_fields或东西。请参阅以下架构。

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

现在在上面的架构的基础上做,

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

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

于 2012-12-12T22:13:49.933 回答
0

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

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

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

然后,您将$regexk字段中了解哪些键名(字段)中有下划线。

作为一条建议,我强烈建议使用 prefixed $regexs ,因为它们在使用您创建的索引时更有效,即对于您显示的查询:^_*

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

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

于 2012-12-12T22:00:08.810 回答
0

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

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

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

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

于 2012-12-12T22:50:22.497 回答