请教一个Nodejs中mongoose数组嵌套的问题

请教一个Nodejs中mongoose数组嵌套的问题

假设存入mongo里面的数据是这样的:

{
  "a": 1,
  "b": 2,
  "c": [
    [
      {
        "d": 3,
        "e": 4
      },
      {
        "d": 4,
        "e": 5
      }
    ],
    [
      {
        "d": 6,
        "e": 7
      },
      {
        "d": 8,
        "e": 9
      }
    ]
  ]
}

请问这个时候Schema结构应该怎么写呢?

我一开始这样写的:

var cs = new Schema({
  d: Number,
  e: Number
});

var ps = new Schema({ a: Number, b: Number, c: [[cs]] });

但后来看文档发现没这种用法,程序也无法运行,但如果改成:

var ps = new Schema({
  a: Number,
  b: Number,
  c: [cs]
});

find出来的数据的结构就跟一开始不一样变成:

{
  "_id": "5392b3751fbda67b48e4b569",
  "a": 1,
  "b": 2,
  "c": [
    {
      "0": {
        "d": 3,
        "e": 4
      },
      "1": {
        "d": 4,
        "e": 5
      }
    },
    {
      "0": {
        "d": 6,
        "e": 7
      },
      "1": {
        "d": 8,
        "e": 9
      }
    }
  ]
}

请问应该怎么设计Schema才能使输出的数据跟一开始的结构一样


7 回复

要实现你所描述的数据结构,并且能够通过 Mongoose 查询返回与原始数据相同的结构,你需要正确地定义嵌套的 Schema。根据你的需求,数据中的 c 字段是一个包含多个子数组的数组,每个子数组包含多个对象。

以下是如何定义 Schema 的步骤:

  1. 定义 de 对象的 Schema
  2. 定义 c 数组的 Schema,它应该是一个包含多个上述对象的数组。
  3. 定义顶级 ps Schema,其中包含 a, bc 字段。

以下是具体的代码实现:

const mongoose = require('mongoose');
const { Schema } = mongoose;

// 定义 d 和 e 对象的 Schema
const deSchema = new Schema({
  d: Number,
  e: Number
});

// 定义 c 数组的 Schema,它是 deSchema 的数组
const cSchema = [deSchema];

// 定义顶级 Schema
const psSchema = new Schema({
  a: Number,
  b: Number,
  c: cSchema
});

// 创建模型
const PsModel = mongoose.model('Ps', psSchema);

// 示例数据
const data = {
  a: 1,
  b: 2,
  c: [
    [
      { d: 3, e: 4 },
      { d: 4, e: 5 }
    ],
    [
      { d: 6, e: 7 },
      { d: 8, e: 9 }
    ]
  ]
};

// 将数据保存到数据库
async function saveData() {
  const newData = new PsModel(data);
  await newData.save();
  console.log("数据已保存");
}

// 查询数据
async function fetchData() {
  const result = await PsModel.find();
  console.log(result);
}

// 调用函数
saveData().then(fetchData);

解释

  1. deSchema: 这个 Schema 定义了 de 字段。
  2. cSchema: 这个 Schema 是一个数组,包含了多个 deSchema 类型的对象。
  3. psSchema: 这个 Schema 包含了 a, bc 字段。c 字段是一个数组,其元素类型为 deSchema
  4. PsModel: 使用 psSchema 创建的 Mongoose 模型。
  5. saveData: 将示例数据保存到数据库中。
  6. fetchData: 查询数据库并打印结果。

通过这种方式,查询的结果将保持与原始数据相同的结构。


楼主解决了吗

我觉得应该不是你数据结构的问题,而是创建数据的时候格式错了

var ps = new Schema({
  a: Number,
  b: Number,
  c: [Array]
});

用的时候:

var ps = new PS({
    a: 1,
    b: 2,
    c: [
        [{
            d: 4,
            e: 5
        },{
            d: 4,
            e: 5
        }]
    ]
})

现在我只能根据帖子最后那个格式的数据拼成我想要的格式。。。

直接使用:

var ps = new Schema({
  a: Number,
  b: Number,
  c: [Array]
});

find出来就变成空的了:

{
    "_id": "5392b3751fbda67b48e4b569",
    "a": 1,
    "b": 2,
    "c": []
}

我现在也遇到了这样的问题

为了实现与原始数据相同的嵌套数组结构,你需要定义一个中间层来处理嵌套数组。你可以使用一个子文档(sub-document)来表示 c 数组中的每个元素,然后再将这些子文档放入一个数组中。

以下是修改后的 Schema 结构:

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

// 定义子文档结构
const subDocSchema = new Schema({
  d: Number,
  e: Number
});

// 定义主文档结构
const mainDocSchema = new Schema({
  a: Number,
  b: Number,
  c: [[subDocSchema]] // 使用子文档数组作为主文档的字段
});

// 创建模型
const MainDoc = mongoose.model('MainDoc', mainDocSchema);

module.exports = MainDoc;

通过这种方式,你可以确保 c 字段仍然是一个二维数组,并且每个元素都是一个符合 subDocSchema 结构的对象。

接下来,你可以通过以下方式插入和查询数据:

// 插入数据
const data = {
  a: 1,
  b: 2,
  c: [
    [
      { d: 3, e: 4 },
      { d: 4, e: 5 }
    ],
    [
      { d: 6, e: 7 },
      { d: 8, e: 9 }
    ]
  ]
};

const newDoc = new MainDoc(data);
newDoc.save((err) => {
  if (err) console.error(err);
  console.log('Document saved successfully.');
});

// 查询数据
MainDoc.findOne({}, (err, doc) => {
  if (err) console.error(err);
  console.log(doc);
});

这样,当你查询数据时,结果将会与原始数据的结构一致。

回到顶部