【问题标题】:remove _id from mongo result从 mongo 结果中删除 _id
【发布时间】:2020-07-28 16:49:37
【问题描述】:

我对 mongo 和 nodejs 很陌生 我的查询结果是 json,我只想将结果作为 http 请求返回,如下所示:

app.get('/itesms', function(req, res) {
  items.find().toArray(function (err, array) {
    res.send(array);
  })
});

它有效,唯一的问题是我想从结果中隐藏 _id 字段(递归)。 有什么建议可以优雅地做到这一点吗?

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    试试这个解决方案:

    app.get('/itesms', function(req, res) {
      items.find({}, { _id: 0 }).toArray(function (err, array) {
        res.send(array);
      })
    });
    

    【讨论】:

    • 太棒了!我见过的最简单的投影:-)
    • 这对我不起作用......而下面的那个是
    • 此解决方案不再适用于最新的 mongo 模块
    【解决方案2】:

    通常的.find({}, {_id:0}) 方法对我不起作用,所以我去寻找another SO answer,在Mongo API 的第3 版中,你需要这样写:.find({}, {projection:{_id:0}})。所以,例如:

    let docs = await db.collection("mycol").find({}, {projection:{_id:0}}).toArray();
    

    看来(至少在nodejs API中)你也可以这样写:

    let docs = await db.collection("mycol").find({}).project({_id:0}).toArray();
    

    【讨论】:

    • 这是正确的答案。在没有等待的情况下记录 docs 的值后将其作为猜测,它显示为 Promise。在他们的文档中没有说得很清楚。
    • 这是我需要的。
    【解决方案3】:

    问题是您不能投影包含和排除,即您不能运行带有“项目”语句的查询,该语句声明应包含在响应中以及必须从响应中排除的内容。 来自 MongoDB documentation:

    投影不能同时包含包含和排除规范,除了 _id 字段的排除。在显式包含字段的投影中,_id 字段是唯一可以显式排除的字段。

    我处理这个问题的方法是在返回响应之前结束进程:

    const dbObjectJSON = dbObject.toJson();
    delete dbObjectJSON._id;
    delete dbObjectJSON.__v;
    ...
    response.json(dbObjectJSON);
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-08-29
      • 1970-01-01
      • 2022-01-23
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 2015-02-04
      相关资源
      最近更新 更多