【问题标题】:Mongo nested array update with conditions带有条件的 Mongo 嵌套数组更新
【发布时间】:2023-03-07 06:18:01
【问题描述】:

我需要更新下面提到的集合的 userAns,ansBody 字段。 where 条件会有 userId ,userQuestions._id 和 quesId。

{ 
"_id" : ObjectId("5b9624b56b0fe824352e887a"), 
"userId" : ObjectId("5b8fd089ee2e6c07765ba024"), 
"userQuestions" : [
    {
        "testStatus" : NumberInt(1), 
        "_id" : ObjectId("5b9624b56b0fe824352e887f"), 
        "questionsId" : [
            {
                "_id" : ObjectId("5b9624b56b0fe824352e8885"), 
                "quesId" : ObjectId("5b94f1e97b8adc3d46854518"), 
                "userAns" : "", 
                "ansBody" : "", 
                "ansStatus" : ""
            }

我尝试过的

  let paramObj={
  userId:"5b8fd089ee2e6c07765ba024",
  quesSetId:"5b9624b56b0fe824352e887b",
  quesId:"5b9619311d9b1b1834f2cd23",
  ansId:"5b9619311d9b1b1834f2cd27",
  ansBody:"abc123"
}
let questionSet=await QuestionSet.update({userId:paramObj.userId,"userQuestions._id":paramObj.quesSetId},
  { $set: {"userQuestions.$[t].questionsId.$[u].ansBody": paramObj.ansBody} },
  { arrayFilters: [ { "t.quesId":paramObj.quesId },{"u.quesId": paramObj.quesId} ] } );

事件虽然它给了我修改后的输出,但文档没有得到更新。

【问题讨论】:

  • 试试let paramObj={ userId:mongoose.Types.ObjectId("5b8fd089ee2e6c07765ba024"); quesSetId:mongoose.Types.ObjectId("5b9624b56b0fe824352e887b"), quesId:mongoose.Types.ObjectId("5b9619311d9b1b1834f2cd23"), ansId:mongoose.Types.ObjectId("5b9619311d9b1b1834f2cd27"), ansBody:"abc123" } let questionSet=await QuestionSet.update({userId:paramObj.userId}, { $set: {"userQuestions.$[t].questionsId.$[u].ansBody": paramObj.ansBody} }, { arrayFilters: [ { "t._id": param.quesSetId"}{"u.quesId": paramObj.quesId} ] } );
  • 这也应该有效。 let questionSet=await QuestionSet.update({userId:paramObj.userId,"userQuestions._id":paramObj.quesSetId}, { $set: {"userQuestions.$.questionsId.$[u].ansBody": paramObj.ansBody} }, { arrayFilters: [ {"u.quesId": paramObj.quesId} ] } );
  • 请确保 id 匹配并且您是 3.6 服务器版本。
  • 您可以尝试在 shell 中设置标志并尝试吗? use admin db.adminCommand ({setFeatureCompatibilityVersion: "3.6"})
  • 好的。您不需要新用户。你有管理员用户吗?您可以在 studio 3t 中尝试查询,看看它是否有效?将 QuestionSet 替换为集合名称,将猫鼬对象 id 替换为 ObjectId

标签: node.js mongodb express mongoose


【解决方案1】:

您必须将对象 ID 作为 ObjectId 类型传递。

为此,如果您使用的是猫鼬,请将字符串转换为猫鼬对象类型。

mongoose.Types.ObjectId('id');

我认为它会解决您的问题。

https://mongoosejs.com/docs/api.html#types-objectid-js

【讨论】:

    猜你喜欢
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2017-01-05
    • 2021-07-20
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多