猫鼬附加在子文档中或子文档本身的数组中

Posted

技术标签:

【中文标题】猫鼬附加在子文档中或子文档本身的数组中【英文标题】:Mongoose Append in subdocument or inside the array in the subdocument itself 【发布时间】:2019-08-09 01:17:28 【问题描述】:

这就是我的 Mongoose 数据库的样子

_id: ObjectId("5c7d6b0b54795c02a6a5cb16")
people:[
   
   _id: ObjectId('7c7d6b0b54795c02a6aa878')
   name: John
   bizs:[
      name:"Shop A",
      name:"Shop B"
    ]
  ,
  
   _id: ObjectId('7c7d6b0b54795c02638b9cd')
   name: Mary
   bizs:[
      name:"Shop X"
    ]
  
]

如果我将一个已经在数据库中的人(例如 John)添加到他的业务中,我需要该业务在 bizs 数组中追加自身。例如 A 店、B 店、C 店。

但如果我添加另一个人不在数据库中(就像我如何添加 Mary),我需要它在人员数组中创建一个全新的对象.

我曾尝试使用 upsert 执行此操作,但它并没有给我想要的。

我怎样才能得到这样的东西?

【问题讨论】:

【参考方案1】:

您首先需要查找是否存在一个名为“John”的人(根据您的示例),这可以使用简单的查找查询来完成。如果该查询的结果为 null 或未定义,那么您可以插入一个新对象(人员数组中的新记录),否则您可以将其附加到找到的文档并保存。

const name =  req.body.name;
Schema.findOne("people.name" : name , (err , user)=>
    if(err)
        //handle
    

    if(!user)
        //create a new record and push it to people array and save it.
    
    else
        //create a record(with your object) and push it to people array and save
        user.people.push();
        user.save()

    
);

【讨论】:

在 mongodb/mongoose 中是否有任何“开箱即用”的方法来执行此操作,而不是按照您的建议首先查找和插入(如果没有找到)? 这个没有“开箱即用的解决方案”。但我希望这会对你有所帮助:***.com/questions/40102372/…

以上是关于猫鼬附加在子文档中或子文档本身的数组中的主要内容,如果未能解决你的问题,请参考以下文章

如何在子文档中填充模型实例数组? MongoDB猫鼬

无法在 MongoDB(猫鼬)文档中追加数组

Expressjs 与猫鼬。并在子文档中获取外键子文档

Expressjs 与猫鼬。并在子文档中获取外键子文档

从 Firestore 文档中获取数据并附加到数组

Mongoose,在子文档数组上应用`.aggregate()`,并以最少的查询次数获得文档其他字段的结果