簡體   English   中英

MongoDB (Mongoose) - 僅獲取嵌套項等於值的記錄

[英]MongoDB (Mongoose) - Get only records where nested item is equal to a value

我搜索了很多,嘗試了幾種方法,但沒有任何效果。

我在 mongo 中有這個:

{
    id: ObjectId("1234567890"),
    answers: [{
        id: 111,
        deleted:0
    },
    {
        id: 222,
        deleted:0
    },
    {
        id: 333,
        deleted:1
    }]
},
{
    id: ObjectId("0987654321"),
    answers: [{
        id: 111,
        deleted:0
    },
    {
        id: 222,
        deleted:1
    },
    {
        id: 333,
        deleted:1
    }]
}

我想要帶有 ObjectId("1234567890") 的文檔,並且只有帶有 delete = 1 的答案(只有 ID 333)。

我已經嘗試過這個:

  var query = chatbotMongoModel.find(
                { _id: "1234567890" },
                { answers: {$elemMatch: {deleted: "1"}}}
            )

但返回所有答案.. 你能給我一些幫助嗎?

謝謝!

拉斐爾

一種方法是使用 mongodb 聚合框架。

var result = await chatbotMongoModel.aggregate([
  {
    $match: {
      id: "1234567890"
    }
  },
  {
    "$unwind": {
      path: "$answers"
    }
  },
  {
    $match: {
      "answers.deleted": 1
    }
  },
  {
    $group: {
      _id: "$id",
      answers: {
        $push: "$answers"
      },
      allFields: {
        $first: "$$ROOT"
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$mergeObjects": [
          "$allFields",
          {
            "answers": "$answers"
          }
        ]
      }
    }
  }
])

請注意,在您的示例文檔中,您有id但您在查詢中使用了_id ,它們必須匹配。 同樣deleted數據類型是示例文檔中的數字,但您在查詢中使用字符串值。

運行mongoplayground

另一種替代解決方案:

var result = await chatbotMongoModel.aggregate([
  {
    $match: {
      id: "1234567890"
    }
  },
  {
    $addFields: {
      "answers": {
        $filter: {
          input: "$answers",
          as: "answer",
          cond: {
            $eq: [
              "$$answer.deleted",
              1
            ]
          }
        }
      }
    }
  }
])

mongoplayground

感謝您的回答! 我找到了一個解決方案,如果有人也需要這個,我會在這里發布......

var query = model.aggregate([
        { $match: { '_id': mongoose.Types.ObjectId("1234567890") } },
        {
          $project: {
            answer: {
              $filter: {
                input: "$answer",
                as: "f",
                cond: { $eq: ["$$f.deleted", 1] }
              }
            }
          }
        }
      ])

問候!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM