如何从MongoDB中的数组中查找并显示特定对象?

时间:2019-11-03 02:08:01

标签: javascript arrays json mongodb object

在我的应用中,我无法编写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"}
]}]});

任何建议,将不胜感激,谢谢。

2 个答案:

答案 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 计数并显示车辆有多少服务记录,或者按英里显示每个服务记录和服务类型。

我知道这可能不是最干净的解决方案,但是对于我的应用程序来说,它一直运行良好。