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

时间:2019-07-23 01:51:31

标签: javascript node.js mongodb aggregation-framework

我有一个从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查询管道函数添加的字段。我试图在查询管道中使用travel_guessceil(travel_guess)更新为$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版,因此我只能使用哪些查询管道功能。

1 个答案:

答案 0 :(得分:0)

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