在Mongoose中,可以在子文档中追加内容,或者在子文档数组中的子文档本身中追加内容。
在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,但它没有给我想要的结果。
我应该如何实现这样的功能?
问题的原因是需要在子文档中的数组内添加内容。解决方法是首先使用简单的查找查询来查找是否存在名为"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中的子文档或子文档的数组中添加内容,需要先查找是否存在特定条件的记录,然后根据查找结果进行相应的操作。虽然没有直接的“开箱即用”解决方案,但我们可以使用上述的方法来实现所需的功能。