在Mongoose中,可以在子文档中追加内容,或者在子文档数组中的子文档本身中追加内容。

7 浏览
0 Comments

在Mongoose中,可以在子文档中追加内容,或者在子文档数组中的子文档本身中追加内容。

我MongoDB数据库的数据如下所示:

_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数组中,例如:Shop A,Shop B,Shop C。

但是如果我要添加一个数据库中不存在的人(就像我已经添加了Mary),我希望它在people数组中创建一个全新的对象。

我尝试过使用upsert,但它没有给我想要的结果。

我应该如何实现这样的功能?

0
0 Comments

问题的原因是需要在子文档中的数组内添加内容。解决方法是首先使用简单的查找查询来查找是否存在名为"John"的人,如果查询结果为null或undefined,则可以将新对象插入到people数组中,否则可以将其追加到找到的文档中并保存。

在MongoDB/Mongoose中没有“开箱即用的解决方案”,但希望以下链接的内容能帮到您:[find one or create with mongoose](https://stackoverflow.com/questions/40102372)

以下是整理的

---

在MongoDB中,如果要在子文档或子文档的数组中添加内容,需要先查找是否存在特定条件的记录,然后根据查找结果进行相应的操作。

首先,我们可以使用Mongoose提供的findOne方法来查找是否存在名为"John"的人。具体代码如下:

const name = req.body.name;
Schema.findOne({"people.name": name}, (err, user) => {
    if (err) {
        // 处理错误
    }
    if (!user) {
        // 如果找不到对应的记录,则创建一个新的记录并将其推送到people数组中,然后保存
    } else {
        // 如果找到了对应的记录,则创建一个新的记录并将其推送到people数组中,然后保存
        user.people.push();
        user.save();
    }
});

上述代码中,我们首先根据传入的name值使用findOne方法进行查找。如果查找结果为null或undefined,表示没有找到对应的记录,则可以创建一个新的记录,并将其推送到people数组中。然后,通过调用save方法将更新后的文档保存到数据库中。

然而,有人提出了一个问题:“有没有MongoDB/Mongoose提供的直接解决方案,而不需要先查找再插入,类似于'开箱即用'的功能?”对于这个问题,回答是没有。但是,我们可以参考下面的链接来了解如何解决这个问题:[find one or create with mongoose](https://stackoverflow.com/questions/40102372)

总结起来,要在MongoDB/Mongoose中的子文档或子文档的数组中添加内容,需要先查找是否存在特定条件的记录,然后根据查找结果进行相应的操作。虽然没有直接的“开箱即用”解决方案,但我们可以使用上述的方法来实现所需的功能。

0