【问题标题】:Mongoose populate method not populating all fields after updating document更新文档后猫鼬填充方法未填充所有字段
【发布时间】:2021-03-22 00:43:57
【问题描述】:

我更改了数组的顺序,然后填充不起作用。它仍然适用于我没有尝试更新的文档。

我有一个分段模型,里面有 preguntas

分段模型

const Schema = mongoose.Schema;

const seccionSchema = new Schema({
  titulo: { type: String },
  preguntas: [
    {
      type: Schema.Types.ObjectId,
      ref: 'Pregunta',
    },
  ],
});

怀孕模型

const Schema = mongoose.Schema;

const preguntaSchema = new Schema({
  titulo: { type: String, required: true },
});

带有 2 个“preguntas”的“Seccion”文档如下所示:

{
    "preguntas": [
        "5fb0a48ccb68c44c227a0432",
        "5fb0a48ccb68c44c227a0433"
    ],
    "_id": "5fb0a50fcb68c44c227a0436",
    "titulo": "Seccion 2",
    "__v": 3
}

我要做的是更改 preguntas 数组中的顺序,以便 _ids 最终成为 [33, 32] 而不是 [32, 33](_ids 的最后两位)。我可以使用“.save()”方法或“.findOneAndUpdate()”进行更新。 这是使用“findOneAndUpdate”的代码:

router.put('/:id', async (req, res) => {
  const seccionId = req.params.id;
  try {
    const seccion = await Seccion.findOneAndUpdate(
      { _id: seccionId },
      { preguntas: ['5fb0a48ccb68c44c227a0433', '5fb0a48ccb68c44c227a0432'] },
      { new: true }
    );
    res.json(seccion);
  } catch (err) {
    res.json({ message: err });
  }
});

结果有效(并且在 mongo atlas 中更改了顺序):

{
    "preguntas": [
        "5fb0a48ccb68c44c227a0433",
        "5fb0a48ccb68c44c227a0432"
    ],
    "_id": "5fb0a50fcb68c44c227a0436",
    "titulo": "Seccion 2",
    "__v": 4
}

但是当我尝试使用 mongoose 的 "populate()" 方法时,只有一个 "preguntas ids" 或没有填充(仅在 " pregunta”以 32 结尾的 id 被填充):

{
    "preguntas": [
        {
            "_id": "5fb0a48ccb68c44c227a0432",
            "titulo": "Pregunta 3",
            "__v": 0
        }
    ],
    "_id": "5fb0a50fcb68c44c227a0436",
    "titulo": "Seccion 2",
    "__v": 4
}

所以我的猜测是填充方法无法正常工作,但它确实适用于我没有尝试更改“preguntas”内部的“preguntas”顺序的其他“Seccion”文档大批。下面是使用“populate”方法的代码:

router.get('/:id', async (req, res) => {
  const seccionId = req.params.id;
  try {
    const seccion = await Seccion.findById(seccionId).populate('preguntas');
    res.json(seccion);
  } catch (err) {
    res.json({ message: err });
  }
});

让填充工作真的很难,非常感谢任何人的帮助

【问题讨论】:

    标签: mongodb mongoose mongoose-populate


    【解决方案1】:

    您确定 id 5fb0a48ccb68c44c227a0433 的 pregunta 存在于 preguntas 集合中吗?

    populate 的工作方式是它使用数组中的 id 对 preguntas 集合执行第二次 find 操作,如果找不到文档,它将从数组中省略。

    问题可能是preguntas集合中不存在以33结尾的那个。

    【讨论】:

    • 以 33 结尾的 id 确实存在(仔细检查),我什至可以看到另一个使用相同 id 但未填充它的文档的结果。我还直接在 mongo atlas 上手动进行了更新,更改新“Seccion”文档的 id 顺序和“populate”在手动更改 id 时也不起作用:/
    • 我相信可能是 ids 数组中的每个索引都有一个指针或引用,如果您更改 id,它会指向旧 id。因为当我改回 id 的顺序时,它又可以工作了
    猜你喜欢
    • 2021-05-06
    • 2021-02-11
    • 2014-09-06
    • 2015-07-13
    • 2016-10-10
    • 1970-01-01
    • 2014-01-08
    • 2021-04-26
    相关资源
    最近更新 更多