使用动态投影在 Mongodb 中进行聚合

Posted

技术标签:

【中文标题】使用动态投影在 Mongodb 中进行聚合【英文标题】:Aggregation in Mongodb with dynamic projection 【发布时间】:2022-01-18 18:24:18 【问题描述】:

我正在使用 Typescript 中的 Nodejs 驱动程序研究 MongoDB;我想从具有“动态”投影的文档中检索子文档;这应该通过列出所需字段的数组来完成:

 
    "_id" : ObjectId("6006be017fdd3b1018e0f533"), 
    "name" : "Cindy", 
    "surname" : "Red", 
    "age" : 30.0, 
    "various" : 
        "aaa1" : "111", 
        "bbb2" : "222"
    

 
    "_id" : ObjectId("6006be0b7fdd3b1018e0f534"), 
    "name" : "Valentina", 
    "surname" : "Green", 
    "age" : 30.0, 
    "various" : 
        "ccc3" : "333", 
        "ddd4" : "444"
    


// This piece of code to execute the query:
const arrayValues = ["$various"];
    const result = await myConnectedClient
      .db("ZZZ_TEST_ALL")
      .collection("my_collection_01")
      .aggregate<any>([
         $project:   _id: 0, arrayValues  ,
      ]);

结果:


  _id: 6006be017fdd3b1018e0f533,
  arrayValues: [  aaa1: '111', bbb2: '222'  ]


  _id: 6006be0b7fdd3b1018e0f534,
  arrayValues: [  ccc3: '333', ddd4: '444'  ]

但我想要这样的结果:


  various:  aaa1: '111', bbb2: '222' 


  various:   ccc3: '333', ddd4: '444'  

谢谢。

【问题讨论】:

添加了一个小例子,让我知道它是否有效:) 是的,它有效。谢谢沃尔夫冈。 【参考方案1】:

应该这样做

const arrayValues = ["$various"];
const result = await myConnectedClient
  .db("ZZZ_TEST_ALL")
  .collection("my_collection_01")
  .aggregate<any>([ $project:  _id: 0, arrayValues  ])
  .map((e) =>
    Object.keys(e.arrayValues[0]).map((k) => 
      return  [k]: e.arrayValues[0][k] ;
    )
  )
  .map((v) => 
    return  various: Object.assign(, ...v) ;
  );

打印(作为 JSON)

[
   "various":  "aaa1": "111", "bbb2": "222"  ,
   "various":  "ccc3": "333", "ddd4": "444"  
]

【讨论】:

以上是关于使用动态投影在 Mongodb 中进行聚合的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb聚合:投影没有最后一个元素的数组

MongoDB: 聚合框架

通过聚合中的索引投影嵌套数组字段值

如何使用 mongodb 中的聚合在嵌入文档的数组中执行操作?

具有特定条件计数的 Mongodb 聚合并按输出投影的日期范围过滤不能按预期工作

MongoDB聚合操作总结