在我的应用中,我无法编写mongo脚本来查找和显示服务日志到一辆车。例如,我有两个用户有多辆车。每辆车都有多个服务日志。对于我编写的查询,我没有太多运气仅显示来自第二个用户的serviceLogs
对象和来自{{1}的_id:"2"
对象。下面是示例数据。
vehicle
下面是我尝试过的查询,我已经对其进行了修改,但没有任何运气。
_id:14
预期结果:
db.collection.insert(
{_id:"1",vehicles:[
{_id:11,make:"Mazda",model:"CX5",serviceLogs:[
{_id:110, "miles" : 7567,"service" : "Wipers replacement"}
]}]});
db.collection.insert(
{_id:"2",vehicles:[
{_id:12,make:"Mazda",model:"CX5",serviceLogs:[]},
{_id:13,make:"Chevy",model:"Sonic",serviceLogs:[]},
{_id:14,make:"Toyota",model:"Tacoma",serviceLogs:[
{_id:111, "miles" : 2134,"service" : "Brake pads replacement"},
{_id:112, "miles" : 5678,"service" : "VSS replacement"}
]}]});
任何建议,将不胜感激,谢谢。
答案 0 :(得分:0)
尝试一下:
db.collection.find({"_id": "2", vehicles: {$elemMatch: {make: "Toyota", model: "Tacoma"}}} ).project({serviceLogs: 1});
更多信息在这里: https://docs.mongodb.com/manual/tutorial/project-fields-from-query-results/
答案 1 :(得分:0)
尽管我没有得到最初期望的确切答案,但我有一个查询,该查询还获得了车辆信息以及服务日志。这样比较好,因为我能够检索车辆的制造商,型号及其所有服务日志。此查询将仅返回符合 _id 和 vehicle._id 的车辆。下面是查询 _id:“ 2” 的车辆的示例。
db.collection.aggregate([
{ $match: { _id: "2" } },
{
$project: {
vehicles: {
$filter: {
input: "$vehicles",
as: "vehicle",
cond: { $eq: ["$$vehicle._id", 14] }
}
},
_id: 0
}
}
]).pretty()
此查询将产生以下结果:
{
"vehicles" : [
{
"_id" : 14,
"make" : "Toyota",
"model" : "Tacoma",
"serviceLogs" : [
{
"_id" : 111,
"miles" : 2134,
"service" : "Brake pads replacement"
},
{
"_id" : 112,
"miles" : 5678,
"service" : "VSS replacement"
}
]
}
]
}
使用MongoDB的 aggregate 和 $ project ,我可以只从目标车辆中检索数据。在我的React应用程序中,下面是用于将车辆数据分配给React状态的示例代码。
API.getOneVehicleForUser(this.state.uid, this.state.vehicleId) // API call passing in the user ID and the vehicle id we want to target
.then(res => { // After the API call returns successfully, we assign the data to React states
this.setState({
make: res.data[0].vehicles[0].make,
model: res.data[0].vehicles[0].model,
serviceLogs: res.data[0].vehicles[0].serviceLogs
})
.catch(err => console.log(err)); // Do anything you want here to handle errors if the API call should fail
this.state.serviceLogs 是一个数组,用于存储所有车辆服务日志。在这里,我可以做任何我想做的事情,例如使用 this.state.serviceLogs.length 计数并显示车辆有多少服务记录,或者按英里显示每个服务记录和服务类型。
我知道这可能不是最干净的解决方案,但是对于我的应用程序来说,它一直运行良好。