【问题标题】:MongoDB - Project only the matching element in an arrayMongoDB - 仅投影数组中的匹配元素
【发布时间】:2016-03-26 22:00:57
【问题描述】:

如何从 Mongo 文档的数组中获取一个具有以下结构的元素:

{
 array : [ 
           {type: 'cat', name: 'George'}
           {type: 'cat', name: 'Mary'} 
           {type: 'dog', name: 'Steve'} 
           {type: 'dog', name: 'Anna'}  

         ]
}

例如我需要得到史蒂夫,在这种情况下结果必须是这样的:

{
 array : [ 
           {type: 'dog', name: 'Steve'}
 ] 
}

左右:{type: 'dog', name: 'Steve'}

我知道如何在发布时制作它,但我需要在整个数组可用的客户端制作它,我可以使用 forEach 从数组中返回这个值,但我正在寻找更优雅的方式(使用 Mongo 查询)。

【问题讨论】:

标签: arrays mongodb meteor minimongo


【解决方案1】:

使用位置运算符($)仅投影第一个匹配的子文档。

db.t.find({"array":{"type":"dog", "name":"Steve"}},{"array.$":1})

使用meteor,您必须坚持聚合,因为positional 运算符不起作用:

db.t.aggregate([
{$match:{"array.type":"dog","array.name":"Steve"}},
{$unwind:"$array"},
{$match:{"array.type":"dog","array.name":"Steve"}}
])

【讨论】:

  • 在服务器端查询看起来像你的确实返回具有匹配元素的数组,但在客户端(minimongo)他们返回整个数组。
  • 不确定问题 - github.com/meteor/meteor/issues/153 是否仍然存在。如果是,您必须遍历所有子文档,如 - stackoverflow.com/questions/27951102/…
  • @experd - 你可能需要坚持aggregating 的结果,在minimongo。请参阅我的更新答案。
  • 抱歉回复晚了。聚合对我有用,但它只有服务器端实现并且是非反应性的。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-24
  • 2018-11-23
  • 1970-01-01
  • 2015-05-27
相关资源
最近更新 更多