【问题标题】:Split a document by its subdocuments按子文档拆分文档
【发布时间】:2013-10-10 00:44:07
【问题描述】:

我现在面临一个问题,无法找到解决方案。 我在每个文档的数组中有一个包含子文档的集合,我想为每个子文档检索一个文档。

举个例子会更容易解释。假设我有一个集合的“模式”:

{
    a: String,
    b: [String]
}

其中 a 和 b 都是必需的。 此集合的文档如下所示:

{
    a : 'hey',
    b: ['me', 'you']
}

我想找到一种方法来进行猫鼬查询,它不会按原样返回此文档,而是这两个文档:

[{
    a: 'hey',
    b: 'me'
 },
 {
     a: 'hey',
     b: 'you'
 }]

这可能吗?

提前致谢。

附: : 我知道一旦我用一个简单的 JS 函数检索了列表,我就可以做到这一点,但我迫不及待地想检索完整的列表并开始使用它。

【问题讨论】:

  • 如果不使用聚合框架,你不能在数据库上做这样的投影(这似乎不太适合这里),即使你可以,结果也不匹配声明的架构?您需要绕过 mongoose,并按照您想要的方式构建结果。
  • @WiredPrairie 为什么您不认为聚合框架不适合?另外,我不需要结果与 Schema 相匹配,只是为了解释文档在集合中的格式。
  • 为什么?因为它的结果有限(不超过 16MB),并且随着文档模式的发展变得更加难以管理。您需要“投影”字段等。它旨在聚合、求和、分组,而不是扩展。
  • 另外,我认为这种类型的工作是“忙碌的工作”,最好留给客户,而不是让大多数应用程序最昂贵的方面来完成这样的任务。您发回的二进制数据比实际存储在数据库中的要多。
  • 您可以选择不同意。这是您的应用程序以及您的计算资源和金钱。只要记住支持的成本更高。

标签: node.js mongodb mongoose


【解决方案1】:

这正是 $unwind 聚合运算符所做的:

MyModel.aggregate({$unwind: '$b'}, function(err, result) { ... });

results 得到一个如下所示的数组:

[ { _id: 524d5f6e1576f8a0f35fca8e, a: 'hey', b: 'me' },
  { _id: 524d5f6e1576f8a0f35fca8e, a: 'hey', b: 'you' } ]

【讨论】:

  • 这太完美了!谢谢!
猜你喜欢
  • 2017-01-31
  • 1970-01-01
  • 2015-07-18
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多