mongoose 如何在mongodb中查找子数组?

mbzjlibv  于 2024-01-08  发布在  Go
关注(0)|答案(2)|浏览(274)

我试图使用聚合和查找,但看起来像我不能保持rolemembers项目。任何想法如何解决它?

  1. db.groups.insertMany([
  2. {
  3. title: 'Hi',
  4. members: [
  5. {
  6. userId: ObjectId('62589515f239750e7e44b958'),
  7. role: 'Admin'
  8. },
  9. {
  10. userId: ObjectId('655f634c632d0c23b9d455de'),
  11. role: 'Member'
  12. }
  13. ]
  14. }
  15. ])

字符串

  1. db.users.insertMany([
  2. {
  3. _id: ObjectId('62589515f239750e7e44b958'),
  4. name: 'A',
  5. },
  6. {
  7. _id: ObjectId('655f634c632d0c23b9d455de'),
  8. name: 'B',
  9. }
  10. ])


我们如何通过使用aggregate来得到这样的结果,非常感谢:

  1. {
  2. title: 'Hi',
  3. members: [
  4. {
  5. user: {
  6. _id: ObjectId('62589515f239750e7e44b958'),
  7. name: 'A',
  8. },
  9. role: 'Admin'
  10. },
  11. {
  12. user: {
  13. _id: ObjectId('655f634c632d0c23b9d455de'),
  14. name: 'B',
  15. },
  16. role: 'Member'
  17. },
  18. ]
  19. }

bvk5enib

bvk5enib1#

$unwind的成员和执行$lookup。双角的对象一点和$group改革的对象。

  1. db.groups.aggregate([
  2. {
  3. "$unwind": "$members"
  4. },
  5. {
  6. "$lookup": {
  7. "from": "users",
  8. "localField": "members.userId",
  9. "foreignField": "_id",
  10. "as": "usersLookup"
  11. }
  12. },
  13. {
  14. "$unwind": "$usersLookup"
  15. },
  16. {
  17. "$set": {
  18. "members": {
  19. "user": "$usersLookup",
  20. "role": "$members.role"
  21. }
  22. }
  23. },
  24. {
  25. "$group": {
  26. "_id": "$_id",
  27. "title": {
  28. $first: "$title"
  29. },
  30. "members": {
  31. "$push": "$members"
  32. }
  33. }
  34. }
  35. ])

字符串
Mongo Playground

展开查看全部
alen0pnh

alen0pnh2#

查找的问题是,如果你将新字段插入到一个现有数组中,它会替换该数组,而不是将结果添加到数组中的每个对象。Mongo文档提供了一个类似的$lookup$mergeObjects的示例。在您的情况下有效使用它的关键是先$unwindmembers。最后,取消展开(rewind?windup?)对象并将members.user添加到单个数组。

  1. db.groups.aggregate([
  2. {
  3. "$unwind": "$members"
  4. },
  5. {
  6. "$lookup": {
  7. "from": "users",
  8. "localField": "members.userId",
  9. "foreignField": "_id",
  10. "as": "members.user"
  11. }
  12. },
  13. {
  14. // convert list of one user to just user object
  15. "$set": {
  16. "members.user": {
  17. "$arrayElemAt": [
  18. "$members.user",
  19. 0
  20. ]
  21. }
  22. }
  23. },
  24. {
  25. // your example output doesn't have this field
  26. "$unset": "members.userId"
  27. },
  28. {
  29. // un-unwind / rewind / windup
  30. "$group": {
  31. "_id": "$_id",
  32. "members": {
  33. "$push": "$members"
  34. },
  35. // add all remaining fields
  36. "title": {
  37. "$first": "$title"
  38. }
  39. }
  40. }
  41. ])

字符串
Mongo Playground
PS.需要一个更优雅的解决方案来选择最终$group中的所有“其他”字段。现在,“title”是唯一的一个,所以它很好,但可能带有$project的东西会更好地适用于这些情况。
对于好奇的人来说,这和Ray's answer之间的区别是我查找到members对象而不是在根级别。如果每个成员对象中有许多字段,那么这个管道不需要set查找其他每个字段。

展开查看全部

相关问题