首页 > 解决方案 > MongoDB:使用 $map 更新查询管道中的对象

问题描述

我有一个从调用返回的对象列表,db.collection.aggregate()它返回一个结果对象数组,如下所示:

{ _id: <some_id>,
  count: 400,
  results:
   [ 
     { _id: 1,
       ...
       travel_guess: 0.1934042214126773,
     },
     { _id: 2,
       <>
       ...
       travel_guess: 0.8451461966883353,
     },
     ...
}

wheretravel_guess是 mongoDB 的$geoNear查询管道功能添加的字段。我正在尝试使用查询管道中travel_guessceil(travel_guess)a进行更新:$map

$project: {
    _id: <some_id>,
    count: '$count',
    results: {
        $map: {
          input: '$results',
          as: 'result',
          in: {
            'travel': { $ceil: '$$result.travel_guess' }
          }
        },
    },
  }
},

虽然这成功更新travel_guess,但所有其他字段都被删除,所以我最终得到一个像这样的对象:

{ _id: <some_id>,
  total: 400,
  results:
   [ { travel: 1 },
     { travel: 1 },
     { travel: 1 },
     { travel: 1 },
     { travel: 2 },
     { travel: 2 },
     { travel: 3 },
     ...
   ]
}

如何在结果对象中保留其他字段?不幸的是,我受限于使用 MongoDB 3.4 版,因此我可以使用的查询管道函数受到限制。

标签: javascriptnode.jsmongodbaggregation-framework

解决方案


您可以指定in表达式中的每个字段。就像是

{ "$project": {
  "_id": 1,
  "count": "$count",
  "results": {
    "$map": {
      "input": "$results",
      "as": "result",
      "in": {
        "travel": { "$ceil": "$$result.travel_guess" },
        "_id": "$$result._id",
        "otherField": "$$result.otherField"
      }
    }
  }
}}

如果你不想指向里面的每个字段$map

{ "$project": {
  "_id": 1,
  "count": "$count",
  "results": {
    "$map": {
      "input": "$results",
      "as": "result",
      "in": {
        "$mergeObjects": [
          "$$result",
          { "travel": { "$ceil": "$$result.travel_guess" }}
        ]
      }
    }
  }
}}

推荐阅读