【问题标题】:Not all nested array values are showing up MongoDB并非所有嵌套数组值都显示 MongoDB
【发布时间】:2021-03-29 05:27:35
【问题描述】:

我正在使用 mongoose、react 等创建一个 MERN 应用程序...我正在尝试使用 axios 创建一个发布功能以将新列表添加到我的数据库中。直到最后一切都很好。我的前端使用 axios 和路由将信息传递到后端,就在我执行 list.save() 之前,我什至 console.log 我正在保存的内容,一切看起来都很好。然后我将查看我的数据库,我的列表中的项目仅按他们的 ID 存储,我根本无法访问他们的 name 属性。我不知道为什么它只是没有出现。我会尝试提供我的代码,但所有内容都被分成不同的文件和文件夹供后端前端使用,所以我希望我的代码和解释有意义。

function addList(listTitle) {
    const newList = {
    title: listTitle
    }
    
    Axios.post("http://localhost:4000/todos/add", newList)
    .then(res => console.log(res.data));
}

以上是我添加列表的帖子请求

Routes.route("/add")
.post(function(req, res) {
    let list = new List({
        title: req.body.title,
        items: defaultItems
    });
    console.log(list.items)
    list.save()
        .then(list => {
            res.status(200).json({"list": "list added successfully"})
        })
        .catch(err => {
            res.status(400).send(err);
            console.log(err);
        });
});

这是我的完美路线,我可以记录所有内容,而且看起来不错。

[{"_id":"5fdcba16b08f7b1380853557","name":"Welcome to your todolist!"},{"_id":"5fdcba16b08f7b1380853558","name":"Hit the + button to add a new item."},{"_id":"5fdcba16b08f7b1380853559","name":"<-- Hit this to delete an item."}]

这是从上面的路由功能中的console.log记录的,这证明了项目有一个名字和一切。但是然后使用我的网站或使用邮递员,或者只是查看我的 mongodb 地图集集合,这就是我的列表项显示的内容。

{"_id":{"$oid":"5fdcbda6068da20c90ffc267"},"items":[{"$oid":"5fdcbd98068da20c90ffc264"},{"$oid":"5fdcbd98068da20c90ffc265"},{"$oid":"5fdcbd98068da20c90ffc266"}],"title":"anotha one","__v":{"$numberInt":"0"}}

我不知道为什么在我执行 list.save() 之前它会很好地显示我的项目及其名称,但是当我查看我的数据库时它就消失了。我不知道这是否有帮助,但我每次保存的项目都是相同的默认项目,是否有可能 mongoose/mongodb 每次都试图引用它们,因为它知道它们是相同的?我不知道这是否有助于或只是让情况更加混乱,但如果可能的话,请提供帮助。

这里要求的是我的两个架构。

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const itemsSchema = new Schema({
    name: String,
    listId: String
  });

module.exports = mongoose.model('Item', itemsSchema);
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const Item = require('./Item');


var listsSchema = new Schema({
    title: String,
    items: [{type: Schema.Types.ObjectId, ref: 'Item'}]
  });
module.exports = mongoose.model('List', listsSchema);

【问题讨论】:

  • 您可以发布List 的架构吗?看起来它可能缺少“名称”作为架构上的字段,默认情况下,猫鼬只会保存您在架构中拥有的字段。没有看到就不能确定。
  • 刚刚添加到帖子中!

标签: node.js reactjs mongodb mongoose mongoose-schema


【解决方案1】:

使用 mongoose 中的 populate() 函数来填充 List 集合中的 items 数组。修改post请求如下图。

Routes.route("/add")
.post(function(req, res) {
    let list = new List({
        title: req.body.title,
        items: defaultItems
    });
    console.log(list.items)
    list.save()
        .then(async (list) => {
            const populatedList = await List.populate(list, [{
              path: 'items'
            }]);
            
            console.log(populatedList);
            res.status(200).json({"list": "list added successfully"})
        })
        .catch(err => {
            res.status(400).send(err);
            console.log(err);
        });
});

【讨论】:

  • 我把我的代码改成了这个,它没有改变任何东西。
【解决方案2】:

我可以在第一个控制台日志中看到,不知何故,一个名为“name”的新属性被添加到数据中,我不确定在哪里。

无论您的架构使用属性“title”,这些都需要匹配。

每当我的 mongoose 响应中缺少某个属性时,我都会看到类似这样的 mongoose 排除字段。这通常是我的查询中的数据和我的模型之间的冲突。

【讨论】:

  • 我的列表架构使用属性“title”,但 console.log 语句正在利用嵌套的项目对象,该架构使用属性“name”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2020-12-24
  • 2016-09-28
相关资源
最近更新 更多