如何在mongoose中获取多个文档的子文档

时间:2018-04-04 10:45:49

标签: mongodb mongoose mongodb-query

我有一个名为Organization的模块,其中一个数组调用其中包含UserSchema对象的用户。现在我需要一个查询来将所有组织文档中的所有用户放在一个数组中。

你可以看到我是mongodb的初学者,并且正常使用sql 但是没有加入我不知道该怎么做。

OrganisationModule:

const OrganisationSchema = new Schema({
  name: { type: String, required: true },
  users: [UserSchema],
  version: String,
});

module.exports.Organisation = mongoose.model('Organisation', OrganisationSchema);

UserSchema:

module.exports.UserSchema = new Schema({
  name: String,
  roles: [String]
})

我的第一次尝试:

routes.get('/', (req, res, next) => {
Organisation.find().populate('users').exec((err, users) => {
  if (err) res.json(err.message)
  else { res.json(users) }
});

结果:

[
  {
    "users": [
      {
        "roles": [ "coordinator" ],
        "_id": "5aafcf80dd248f7ef86e0512",
        "name": "Peter"
        "__v": 0
      }
    ],
    "_id": "5aafcf80dd248f7ef86e05cf",
    "name": "DEFAULT",
    "__v": 1
  },
  {
    "users": [
      {
        "roles": [ "admin", "coordinator" ],
        "_id": "5aafcf80dd248f7ef86e0500",
        "name": "Max"
        "__v": 0
      }
    ],
    "_id": "5aafcf80dd248f7ef86e05ce",
    "name": "Organisation_01",
    "__v": 1
  }
]

我需要什么:

[
  {
    "roles": [ "coordinator" ],
    "_id": "5aafcf80dd248f7ef86e0512",
    "name": "Peter"
    "__v": 0
  },
  {
    "roles": [ "admin", "coordinator" ],
    "_id": "5aafcf80dd248f7ef86e0500",
    "name": "Max"
    "__v": 0
  }
]

2 个答案:

答案 0 :(得分:1)

这个

Organization.find(
  {},
  {_id: 0, users: 1}
)

会回来

[
  {
    users: {
      roles: ['coordinator'],
      _id: '5aafcf80dd248f7ef86e0512',
      name: 'Peter',
      ....
    },
  },
  {
    users: {
      roles: ['admin', 'coordinator'],
      _id: '5aafcf80dd248f7ef86e0500',
      name: 'Max',
      ....
    },
  },
];

这并不完全是您想要的,但这是我发现最符合您需求的。

您可以在这里找到更多信息:

否则,还有一种方法

// Meaby you will need to add await
const users = Organization.find({}).map((item: any) => item.users);

答案 1 :(得分:0)

在mongodb中,您可以使用$lookup执行该操作。

  

请在这里学习$ lookup:https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

在猫鼬中你可以使用populate()

例如:

Organization.find().populate('users')
  

在这里研究猫鼬的人口:http://mongoosejs.com/docs/populate.html