MongoDB:返回所有子文档的列表

Posted

技术标签:

【中文标题】MongoDB:返回所有子文档的列表【英文标题】:MongoDB : return a list of all subdocument 【发布时间】:2016-04-26 23:04:40 【问题描述】:

我正在努力学习 Meteor/Mongo,但每次你想进步时,“简单的事情”似乎完全遥不可及......

我有一个非常简单的文档:

_id   : abcd
field : xyz
subdoc [
  _id: 123, email: abc, name: abc
  _id: 234, email: abc, name: xyz
  _id: 853, email: abc, name: pmu
]

我想返回我所有子文档的列表。 换句话说,我想在我的 html 模板中使用“each”得到一个这样的列表:

  _id: 123    email: abc    name: abc
  _id: 234    email: abc    name: xyz
  _id: 853    email: abc    name: pmu

但我完全无法使用 .dot 表示法获得任何结果.. 有什么线索吗?

非常感谢..

【问题讨论】:

您正在处理的查询是什么? 您是否尝试过打印响应正文?或者使用任何打印语句? db.collection.findOne(, 'subdoc': 1, '_id': 0 )db.collection.find(, 'subdoc': 1, '_id': 0 ) 取决于你想要什么。 【参考方案1】:
myCollection.find(_id: 'abcd').fetch().forEach(function(item)  return item.subdoc; );

使用 findOne 甚至更简单

myCollection.findOne(_id: 'abcd').subdoc;

注意:

在这 2 种情况下,_id 仅返回一个文档(因为 _id 是唯一的)您将获得 subdoc 数组。

如果您使用第一种解决方案并且您的查询返回多个文档,那么您将获得一个数组数组。

如果您想要的是来自 Arrays 数组的平面数组,则需要展平该数组

带下划线的就是

flattened = _.flatten(nestedArray)

【讨论】:

有很多延迟,抱歉。它就像一个魅力......谢谢。顺便说一句,如果我想检索嵌套文档中的特定字段,最简单的方法是什么? 使用array.map(function(item)return item.field)【参考方案2】:

如果您使用的是较新版本的 MongoDB (4.x),则可以使用聚合功能。因此,您可以在数据库服务器本身上执行此操作,而不是在 javascript 中进行扁平化。

myCollection.aggregate([
    $unwind : "$subdoc",
    $project : 
        _id : 0, 
        id : "$subdoc._id", 
        name : "$subdoc.name", 
        email: "$subdoc.email"
       
     
])

【讨论】:

以上是关于MongoDB:返回所有子文档的列表的主要内容,如果未能解决你的问题,请参考以下文章

仅在 mongodb 聚合中返回具有最新子文档的文档

MongoDB将子文档作为数组返回

如何从 mongodb 通过 Geowithin 获取匹配的子文档?

et 从 MongoDB 返回整个子文档数组

mongodb 通过查询字段只返回子文档

mongodb 通过查询字段只返回子文档