MongoDB:使用 $map 更新查询管道中的对象



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

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

其中travel_guess是mongoDB的$geoNear查询管道函数添加的字段。我正在尝试使用查询管道中的$maptravel_guess更新为ceil(travel_guess)

$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 版,所以我可以使用哪些查询管道函数受到限制。

您可以在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" }}
        ]
      }
    }
  }
}}

最新更新