如何在Ballerina中执行MongoDB基于ObjectId的过滤查询?
在Ballerina中实现MongoDB按ObjectId过滤查询
你提到在Java中可以通过BSON实现按ObjectId过滤查询,但在Ballerina里找不到对应方法,且注释里的new object"写法无法正常工作。下面是正确的实现方式:
核心解决思路
在Ballerina的MongoDB客户端中,需要使用mongo:ObjectId类型来构造ObjectId过滤条件,而非直接使用字符串或自定义对象写法。
修改后的示例代码
import ballerina/mongo; import ballerina/io; import ballerina/log; // 确保Historial记录中对应ObjectId类型的字段声明正确 type Historial record { int unique_id; string destination_address; mongo:ObjectId _id; mongo:ObjectId user_id?; // 若user_id是ObjectId类型,需声明为对应类型 }; public function main() returns error? { mongo:Client mongoClient = check mongo:Client("mongodb://localhost:27017"); string collectionName = "trip_histories"; // 正确构造按ObjectId过滤的查询条件 map<json> queryString = {user_id: mongo:ObjectId("61b75a0a08f2bf69b98a174c")}; map<json> projectionDoc = {unique_id: true, destination_address: true, _id: true}; stream<Historial, error?> h_viajes = check mongoClient->find( collectionName = collectionName, projection = projectionDoc, filter = queryString ); check h_viajes.forEach(function(Historial datas) { io:println(datas.unique_id.toString()); io:println(datas._id.toString()); log:printInfo(datas.unique_id.toString()); }); }
关键注意事项
- 字段类型匹配:你的
Historial记录中,若user_id字段存储的是MongoDB ObjectId,必须将其声明为mongo:ObjectId类型,否则查询结果映射会出错。 - ObjectId构造:使用
mongo:ObjectId("<ObjectId字符串>")创建合法的ObjectId实例,作为过滤条件的值传入filter参数,MongoDB客户端会自动识别并转换为正确的BSON查询格式。
内容的提问来源于stack exchange,提问作者Jose Osorio
相关产品推荐
相关产品推荐

