MongoDB投影操作符能否将查询结果转为对象而非数组?
MongoDB查询结果转为以_id为键的对象方案
- MongoDB原生层面没有直接操作能让
find+投影后直接返回以_id为键、选中字段为值的对象,默认find操作返回的是文档数组。 - 在Swift/Vapor中,可以通过
flatten配合Dictionary(uniqueKeysWithValues:)实现这个转换。
示例
首先是MongoDB的查询语句(用于获取指定字段的文档数组):
db.bios.find( { }, { _id: 1, name: 1, contribs: 1 } )
然后是Swift/Vapor中的转换代码:
// 假设已通过MongoDB驱动获取查询结果数组,类型为[BSONDocument] let documents: [BSONDocument] = ... // 转换为以_id为键的字典 do { let idKeyedDict = try Dictionary(uniqueKeysWithValues: documents.map { doc in guard let id = doc["_id"] as? BSONObjectID else { throw Abort(.internalServerError, reason: "缺少无效的_id字段") } // 提取需要的字段构造值对象 let name = doc["name"] as? String let contribs = doc["contribs"] as? [String] let value = ["name": name, "contribs": contribs] return (id, value) }) // 使用转换后的字典 print(idKeyedDict) } catch { print("转换失败:\(error)") }
注意:使用
Dictionary(uniqueKeysWithValues:)时需确保所有文档的_id唯一,否则会抛出重复键错误。
内容的提问来源于stack exchange,提问作者János
相关产品推荐
相关产品推荐

