Nodejs MongoDB 嵌套文件处理

Nodejs MongoDB 嵌套文件处理

var phone = req.body.phone
var newPeople = new People({
name: name,
friend: [{
friendName: friendName,
phone: phone,
adress: adress,
}]
});

到这里可以取到 phone 的值吗? newPeople.save(function()); save方法里

friend: [{
    phone: this.phone
}]

这样用 this 赋值可以吗

这种嵌套的数据要怎么赋值


4 回复

Node.js MongoDB 嵌套文件处理

在处理嵌套数据时,特别是在使用 Node.js 和 MongoDB 进行操作时,我们需要确保正确地初始化和保存嵌套对象。以下是一个示例,展示如何在 Node.js 中处理嵌套的 friend 对象,并将其保存到 MongoDB 中。

示例代码

假设我们有一个 People 模型,它包含一个 friend 数组,数组中的每个元素都是一个嵌套对象。我们将通过一个 POST 请求接收 name, friendName, phone, 和 adress 参数,并将这些信息保存到数据库中。

const express = require('express');
const mongoose = require('mongoose');

const app = express();
app.use(express.json());

// 定义 People 模型
const PeopleSchema = new mongoose.Schema({
    name: String,
    friend: [{
        friendName: String,
        phone: String,
        adress: String,
    }]
});

const People = mongoose.model('People', PeopleSchema);

// 连接 MongoDB
mongoose.connect('mongodb://localhost:27017/testdb', {
    useNewUrlParser: true,
    useUnifiedTopology: true
});

// 处理 POST 请求
app.post('/people', (req, res) => {
    const { name, friendName, phone, adress } = req.body;

    // 创建一个新的 People 实例
    const newPeople = new People({
        name: name,
        friend: [{
            friendName: friendName,
            phone: phone,
            adress: adress,
        }]
    });

    // 保存到数据库
    newPeople.save((err, savedPeople) => {
        if (err) {
            return res.status(500).send(err);
        }
        res.send(savedPeople);
    });
});

app.listen(3000, () => console.log('Server is running on port 3000'));

关于 this 的问题

在你的例子中,this 关键字通常用于引用当前对象实例。但是,在创建新对象时,你不能直接使用 this 来引用尚未完全初始化的对象属性。例如:

friend: [{
    phone: this.phone // 这里会出错,因为 `this` 指向的是父级对象,而不是当前对象
}]

正确的做法是在创建对象时直接赋值,如上面的示例所示。你可以将所有需要的数据传递给 People 构造函数,并在构造函数内部进行赋值。

总结

  • 使用 this 关键字来引用尚未完全初始化的对象属性会导致错误。
  • 在创建嵌套对象时,最好直接初始化并赋值。
  • 确保在保存之前正确地初始化和设置所有必要的属性。

希望这能帮助你更好地理解和处理 Node.js 中的嵌套文件处理问题。


直接用phone就行了 变量作用域问题

前面那块var phone = req.body.phone,然后在newPhone中对phone赋值这里应该怎么赋值,如上代码是赋值不了的啊

在这个问题中,你需要处理从请求体中获取 phone 值,并将其用于嵌套的 friend 数组中的对象。下面是具体的解答和示例代码。

可以取到 phone 的值吗?

是的,你可以通过 req.body.phone 来获取 phone 的值。确保你已经正确地解析了请求体(例如使用中间件如 body-parser)。

thissave 方法里是否可用?

save 方法里,this 指向的是当前的文档实例。因此,你可以在回调函数中访问已保存的文档的属性。但在这个场景下,你不需要在 save 方法里再次赋值 phone,因为你在创建 newPeople 实例时已经设置了这些值。

如何赋值嵌套的数据?

你已经在创建 newPeople 实例时正确地嵌套了数据。你可以在 friend 数组中直接设置 phone 属性,如下所示:

const mongoose = require('mongoose');
const People = mongoose.model('People', {
    name: String,
    friend: [{
        friendName: String,
        phone: String,
        adress: String
    }]
});

// 示例请求体
var phone = req.body.phone;
var name = req.body.name;
var friendName = req.body.friendName;
var adress = req.body.adress;

// 创建新的 People 实例
var newPeople = new People({
    name: name,
    friend: [{
        friendName: friendName,
        phone: phone,
        adress: adress
    }]
});

// 保存到数据库
newPeople.save(function(err, savedPeople) {
    if (err) {
        console.error("Error saving document:", err);
        return;
    }
    console.log("Saved document:", savedPeople);
});

解释

  1. 定义 Schema 和 Model:首先定义一个 Mongoose Schema 并创建一个 Model。
  2. 从请求体中获取参数:从 req.body 中获取 name, friendName, phone, 和 adress
  3. 创建并初始化文档:创建一个新的 People 文档实例,并初始化 namefriend 数组。
  4. 保存文档:调用 save 方法将新文档保存到数据库中,并在回调函数中处理可能的错误或成功的保存结果。

这样,你就能够正确地处理嵌套的数据结构并保存到 MongoDB 中。

回到顶部