如何删除数组中mongo对象的属性?

安达卢西亚人

我希望下面的代码片段使我的问题更加清楚。我可以获取一个嵌入了类别对象数组的对象。从类别对象,我只想显示某些属性。

所以这就是我现在得到的:

{
  "photo": [],
  "_id": "5ec55ae39eere8ert85bf8fe749",
  "title": "Blog about coding",
  "description": "Hi, I want to share with you my incredible journey as a software developer...",
  "rate": 3,
  "category": [
    {
      "_id": "5ec55ae39aaa78985f8fe74a",
      "name": "programming",
      "display_name": "Programming"
    }
  ],
  "createdAt": "2020-05-20T16:29:23.982Z",
  "updatedAt": "2020-05-20T16:29:23.982Z",
  "__v": 0
}

使用以下代码:

/* GET blog with id */
router.get("/:id", async (req, res, next) => {
    try {
        const blog = await Blog.findById(req.params.id); // How to filter out fields of objects in category array?
        res.send(blog);
    } catch(ex) {
        res.status(400).send(ex); 
    }
});

这就是我真正想要的:

{
  "photo": [],
  "_id": "5ec55ae39eere8ert85bf8fe749",
  "title": "Blog about coding",
  "description": "Hi, I want to share with you my incredible journey as a software developer...",
  "rate": 3,
  "category": [
    {
      "display_name": "Programming"
    }
  ],
  "createdAt": "2020-05-20T16:29:23.982Z",
  "updatedAt": "2020-05-20T16:29:23.982Z",
  "__v": 0
}

因此,在类别中,我只需要“ display_name”

我怎么能得到这个。我以为以前看过解决方案,但现在找不到了。

谁-假面真灵魂

由于您使用的.findById()是猫鼬包装器,.findOne({_id: ObjectId()})因此减轻了将输入字符串转换为的负担ObjectId(),但是.find()对投影没有太多帮助,因此您需要列出所有字段,如下所示:

/** .findById(inputString, projection) */

Blog.findById(req.params.id,
{
  "category.display_name": 1,
  "title": 1,
  "description": 1,
  "rate": 1,
  "createdAt": 1,
  "updatedAt": 1
})

/** Or */

Blog.findById(req.params.id,
{
  "category._id": 0,
  "category.name": 0,
})

测试:由于游乐场不能使用以下.findById测试.find()mongoplayground

但是,如果您倾向于使用聚合,则可以在投影中做更多的事情:

const mongoose = require('mongoose');

/* GET blog with id */
router.get("/:id", async (req, res, next) => {
    try {
        const blog = await Blog.aggregate([{$match : {_id : mongoose.Types.ObjectId(req.params.id)}},
            { $addFields: { category: { $map: { input: "$category", in: { display_name: "$$this.display_name" } } } } }
        ]);
        res.send(blog);
    } catch(ex) {
        res.status(400).send(ex); 
    }
});

测试: mongoplayground

注意:此聚合查询将遍历category数组并仅保留display_name在每个对象中。仅在需要排除category对象中的许多字段时才使用此管道我建议使用第二个选项,.findById()因为您无需转换stringObjectId()聚合管道,而只需要排除类别数组的字段name_id内部对象。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

删除数组中对象的属性

来自分类Dev

如何删除数组中对象的键

来自分类Dev

如何根据多个对象属性有条件地删除数组中的对象?

来自分类Dev

删除数组中的对象

来自分类Dev

删除数组中的对象

来自分类Dev

如何从包含多个数组的对象中删除数组

来自分类Dev

如何删除数组对象中数组内部的项目?javascript

来自分类Dev

如何在RethinkDB中删除数组中的特定对象

来自分类Dev

从数组中删除数组中的对象

来自分类Dev

如何在 Java 中删除数组通用对象 Sack

来自分类Dev

如何删除数组中的[“”]?

来自分类Dev

如何从for循环中删除数组对象

来自分类Dev

从javascript对象中删除数组

来自分类Dev

从对象中删除数组组件

来自分类Dev

MongoDB:在Mongoose中删除数组对象

来自分类Dev

JavaScript删除数组中的等效对象

来自分类Dev

删除数组中的相同对象

来自分类Dev

JavaScript - 从对象中删除数组

来自分类Dev

Angular 2:删除数组中的对象

来自分类Dev

如何从对象数组中删除属性?

来自分类Dev

如何从列表/数组中删除对象属性?

来自分类Dev

如何从对象数组中删除属性?

来自分类Dev

Mongo删除数组索引

来自分类Dev

如何通过对象的属性从对象数组中删除特定的对象?

来自分类Dev

如何在Mongo中使用Java添加和删除数组中的元素?

来自分类Dev

如何在Mongo中使用Java添加和删除数组中的元素?

来自分类Dev

如何从多个匹配对象中删除数组中的单个对象

来自分类Dev

删除数组中的重复对象,但在javascript中继续添加一些属性

来自分类常见问题

删除数组中所有对象的属性