MongoDB将子文档作为数组返回

Posted

技术标签:

【中文标题】MongoDB将子文档作为数组返回【英文标题】:MongoDB return sub document as an array 【发布时间】:2021-12-03 19:56:07 【问题描述】:

我有一个关于猫鼬的问题

const result = await modelProfile.findOne(
    
      _id: profileId,
    ,
     'payItems.ACId': 1 
  );

个人资料样本是


    "firstName": "ABC",
    "lastName": "DEF",
    "payItems": [
       
        "ACId": 
            "$oid": "6168825c5d0edbc0b61615db"
        ,
        "balance": 0,
        "rate": 0
    , 
        "ACId": 
            "$oid": "6168825c5d0edbc0b61615dc"
        ,
        "balance": 1,
        "rate": 2
    ]

当我运行它时,它会返回以下正确的结果:

 payItems: 
   [
      ACId: ObjectId("6168825c5d0edbc0b61615db") ,
      ACId: ObjectId("6168825c5d0edbc0b61615dc")  
   ] 

这是正确的,有什么方法可以让我在 MongoDB 上“不带键”返回类似这样的东西(ID 数组)?

 [  
    ObjectId("6168825c5d0edbc0b61615db"),
    ObjectId("6168825c5d0edbc0b61615dc")
 ]

【问题讨论】:

【参考方案1】:

您可以为此使用聚合管道。您可以查看a live demo of this query here

类似:

const result = await modelProfile.aggregate([
  
    "$match": 
      "_id": profileId
    
  ,
  
    "$group": 
      "_id": null,
      "payItems": 
        "$push": "$payItems.ACId"
      
    
  ,
  
    "$project": 
      "_id": 0,
      "payItems": 1
    
  
])

返回:

[
  
    "payItems": [
      [
        ObjectId("6168825c5d0edbc0b61615db"),
        ObjectId("6168825c5d0edbc0b61615dc")
      ]
    ]
  
]

更新

您可以查看live demo here

新查询

db.collection.aggregate([
  
    "$match": 
      "_id": 1
    
  ,
  
    "$group": 
      "_id": null,
      "payItems": 
        "$push": "$payItems.ACId"
      
    
  ,
  
    "$project": 
      "_id": 0,
      "payItems": 1
    
  ,
  
    "$unwind": "$payItems"
  
])

新结果

[
  
    "payItems": [
      ObjectId("6168825c5d0edbc0b61615db"),
      ObjectId("6168825c5d0edbc0b61615dc")
    ]
  
]

详情

这意味着你必须这样做:

const results = await modelProfile.aggregate([
  
    "$match": 
      "_id": 1
    
  ,
  
    "$group": 
      "_id": null,
      "payItems": 
        "$push": "$payItems.ACId"
      
    
  ,
  
    "$project": 
      "_id": 0,
      "payItems": 1
    
  ,
  
    "$unwind": "$payItems"
  
]);

results.forEach((result) => 
  // result.payItems has the ids you are looking for
  // If you know you only want the first item in the array
  // just do: 
  // const result = results[0];
  // result.payItems.forEach(item => ...);

  result.payItems.forEach((id) => 
    console.log(id);
  );
)

【讨论】:

谢谢,亲爱的@Matt,有没有办法只接收最后一个嵌套数组,而不是它周围的两个数组?我的意思是结果只有以下? [ ObjectId("6168825c5d0edbc0b61615db"), ObjectId("6168825c5d0edbc0b61615dc") ] 感谢您的宝贵时间@Matt 嘿@MehranIshanian 我用更精致的东西更新了我的答案。 对不起,我一开始误解了你的意思。道歉。 非常欢迎您,@MehranIshanian :) 如果这有助于解决您的问题,请确保将我的答案作为已接受的答案 :) 谢谢。

以上是关于MongoDB将子文档作为数组返回的主要内容,如果未能解决你的问题,请参考以下文章

mongodb查询以将子文档显示为主文档并使用它进行分页

MongoDB聚合查询 - 返回嵌套子文档中的所有项目

MongoDB - 查询计算数组中的嵌套文档

返回文档,其中数组元素包含输入数组的所有值 | MongoDB

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

MongoDB通过***属性和嵌套数组键查找文档,并返回匹配文档的一部分