如何在猫鼬中动态地将值推入对象的属性?

Posted

技术标签:

【中文标题】如何在猫鼬中动态地将值推入对象的属性?【英文标题】:how to push value in to object's property dynamically in mongoose? 【发布时间】:2020-11-01 20:21:17 【问题描述】:

我想根据使用 mongoose 从前端收到的属性值将值推送到数组中。

架构:

authencity: 
        fake: [],
        notSure: [],
        authentic: [],
      

现在我想根据从前端接收到的属性值将值推送到数组中

const result = await News.findOneAndUpdate( name: newsName ,  $push:  `authencity[$authencityType]`: email  );

authencityType 可以是假的、notSure 和真实的,基于此值我想将该值插入到相应的数组中。

样本数据:

Sample Document :
    "_id": 
        "$oid": "5f0af1e09a724b06c86bfaec"
    ,
    "authencity": 
        "fake": [],
        "notSure": [],
        "authentic": []
    ,
    "name": "Rajasthan deputy CM Sachin Pilot\u2019s supporters come to Gurugram resort, call police summon a joke",
    "description": "",
    "url": "https://news.google.com/__i/rss/rd/articles/CBMiqwFodHRwczovL3d3dy5oaW5kdXN0YW50aW1lcy5jb20vaW5kaWEtbmV3cy9yYWphc3RoYW4tZGVwdXR5LWNtLXNhY2hpbi1waWxvdC1zLXN1cHBvcnRlcnMtY29tZS10by1ndXJ1Z3JhbS1yZXNvcnQtY2FsbC1wb2xpY2Utc3VtbW9uLWEtam9rZS9zdG9yeS1ZQ1BQVDFlandtb1RoQXJaRXVabmNOLmh0bWzSAa0BaHR0cHM6Ly9tLmhpbmR1c3RhbnRpbWVzLmNvbS9pbmRpYS1uZXdzL3JhamFzdGhhbi1kZXB1dHktY20tc2FjaGluLXBpbG90LXMtc3VwcG9ydGVycy1jb21lLXRvLWd1cnVncmFtLXJlc29ydC1jYWxsLXBvbGljZS1zdW1tb24tYS1qb2tlL3N0b3J5LVlDUFBUMWVqd21vVGhBclpFdVpuY05fYW1wLmh0bWw?oc=5",
    "category": "general",
    "language": "en",
    "country": "in",
    "__v": 0

收到的数据:电子邮件:abcd@gmail.com authencityType 可能是假的或不确定的或真实的

我想根据收到的 authencityType 推送特定数组中的值

【问题讨论】:

【参考方案1】:

您需要使用the dot notation 而不是方括号来定义您的路径:

`authencity.$authencityType`

例如authenticity.fake

尝试:

const result = await News.findOneAndUpdate( name: newsName ,  $push:  `authencity.$authencityType`: email  ,  new: true );

还要注意,在 mongoose 的 findOneAndUpdate 版本中,您需要传递 new: true 参数才能返回修改后的文档

【讨论】:

@AdityaVyas 你能展示一个示例文档和你要更新的数据吗? @AdityaVyas 您正在基于newsName 构建查询,但您说有效负载仅包含email。对吗? newName 我从参数中获取。 您可以通过newName 找到您的文档吗? result 的值是多少? 是的,它是完整的文档【参考方案2】:
const newColumn = `authencity.$authencityType`;

const result = await News.findOneAndUpdate( name: newsName ,  $push:  [newColumn]: email  ,  new: true );

在这里,我创建了一个动态字符串来使用模板文字构造一个列名,然后用 [] 将它括起来,所以 mongo 会认为这是一个列名

【讨论】:

请考虑解释您的代码以及它将如何提供帮助,以便其他人可以从中受益。

以上是关于如何在猫鼬中动态地将值推入对象的属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在猫鼬中异步填充嵌套对象?

如何在猫鼬中编写键值对对象模式

如何仅在猫鼬中使用聚合填充嵌套在对象数组中的字段?

如何在猫鼬中更新嵌套数组值

如何在 FindById 中进行循环,然后在猫鼬中发送响应?

如何在猫鼬中使用聚合