【问题标题】:MongoDB : return a list of all subdocumentMongoDB:返回所有子文档的列表
【发布时间】: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 }) 取决于你想要什么。

标签: arrays mongodb meteor nested


【解决方案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"
       }
     }
])

【讨论】:

    猜你喜欢
    • 2018-06-13
    • 1970-01-01
    • 2023-03-30
    • 2017-02-04
    • 2017-01-12
    • 2021-06-17
    • 2020-11-12
    • 2020-08-04
    • 1970-01-01
    相关资源
    最近更新 更多