如何在 Mongoose 中将一个模式的引用添加到另一个模式并通过 json 插入数据?

Posted

技术标签:

【中文标题】如何在 Mongoose 中将一个模式的引用添加到另一个模式并通过 json 插入数据?【英文标题】:How to add reference of one schema to another in Mongoose and inserting data by json? 【发布时间】:2015-09-14 06:31:04 【问题描述】:

我正在编写一个 node.js 应用程序,其中有两个猫鼬模式 WalletUser

我想添加 Wallet 作为对用户的引用 并从 POSTMAN 传递适当的 json。这就像在 OOP 中在另一个类中添加一个类的引用,在 RDBMS 中添加外键概念。

我已经写了这样的模式:

user.js

var mongoose = require('mongoose');

var userSchema = new mongoose.Schema(
    userId: type: String,
    isAdmin: type: Boolean, default: false,
    password: type: String,
    name: type: String,
    wallet: type: mongoose.Schema.Types.ObjectId, ref: 'Wallet' //see here
);

module.exports = mongoose.model('User', userSchema);

我上面引用钱包的方式对吗?如果没有,你能告诉我正确的方法吗?

wallet.js

var mongoose = require('mongoose');

var walletSchema = new mongoose.Schema(
    money: type: Number, default: 0, min: 0,  
);

module.exports = mongoose.model('Wallet', walletSchema);

以下是我的用户路由文件。

userRoute.js

router.route('/user')

.post(function (req, res) 

    var user = new User();

    user.userId = req.body.userId;
    user.password = req.body.password;
    user.name = req.body.name;
    user.isAdmin = req.body.isAdmin;
    user.wallet = req.body.wallet; // see here

    user.save(function(err, user)
        if(err)
            res.json( message: 'Failure' );
            return false;           
        
        res.json( message: 'Success' );
    );     
)

我将钱包分配给用户对象的方式是否正确?如果不是,你能告诉我正确的方法吗?

现在我想从 Postman 发布原始 json。 json 会是什么样子?

【问题讨论】:

【参考方案1】:

user.wallet = req.body.wallet 不起作用。

User 而言,user.wallet 只是一个 ObjectId 类型的简单字段,它存储一个 24 字符的十六进制字符串对象:522abc...

这个“参考”其实是对Mongoose的更高层次的解释。

这就是为什么你不能直接做user.wallet = req.body.wallet。你必须这样做:

var user = new User();
…
// user.wallet = req.body.wallet; // won't work
var wallet = new Wallet(req.body.wallet) // because Wallet too is a Schema just like User
user.wallet = wallet.id;
…

【讨论】:

好的,我知道了。现在你能给我一个我可以发布的示例 json 吗?我想看看json结构..怎么在json里传钱包。 我其实没看懂那部分。您能否详细说明或提供一些背景信息?你的意思是你的req.body.wallet 应该是什么样子?或者您是在谈论通过res.json 将其发送给客户? 是的,我的意思是 req.body.wallet 在 json 中发帖时的样子。例如。 "userId": "xxyyzz", "password": "12345", "name": "Utsav", "isAdmin": "true", "wallet": 这是我的困惑..怎么写钱包json 它应该与您在架构中定义它的方式完全相同。 money: 123 。如果您的表单中只有一个money 字段(即req.body.money),那么您将使用var wallet = new Wallet(money: req.body.money)。主要的事情仍然是它应该与您在架构中定义它的方式完全相同,就像您创建user 的方式就是您创建wallet 的方式一样。然后简单地user.wallet = wallet.id 好的,知道了。感谢您的帮助!

以上是关于如何在 Mongoose 中将一个模式的引用添加到另一个模式并通过 json 插入数据?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose:如何计算其他模式引用的模式数量?

如何填充递归模式引用 Mongodb、Mongoose、Express?

在 MongoDB 中将 ObjectId 与 Mongoose 一起使用

如何在mongodb中将字段添加到用户的帐户

如何在 Mongoose 中为模式属性添加选项?

创建新模式对象后,Mongoose 引用的字段丢失