2

以下のドキュメントにネストされている「回答」オブジェクトの 1 つを削除する必要があります。私が探している答えのテキストがあります。質問のインデックスや、配列にドリルダウンする必要がある回答がありません。

たとえば、ドリルダウンしようとしている質問のテキストが「これは質問です」であることを知っています。削除したい回答は「Answer One」です。

どうやってそれをするつもりですか?

サンプルの MongoDB Doc は次のとおりです: (クイズには質問があります。質問には回答があります)。

{
    name: "Sample Quiz",
    categories: [
      { name: "testcategory1", description: "this is a test category" }
      ,{ name: "categoryTWO", description: "the second category" }
    ],

    questions: [

      { text: "This is a question."
        ,answers: [
          {text: "Answer One", affected_categories: "testcategory1"}
          ,{text: "Answer Two", affected_categories: "testcategory1"}
          ,{text: "Answer Three", affected_categories: "categoryTWO"}
        ]
      }

      ,{ text: "This is the second question."
        ,answers: [
          {text: "Mepho One", affected_categories: "testcategory1"}
          ,{text: "Answer Toodlydoo", affected_categories: "testcategory1"}
          ,{text: "Lehmen Sumtin", affected_categories: "categoryTWO"}
        ]
      }
    ],
  }

1 レベル下にネストされたアイテム (この場合は質問) を削除していたとき、次のようなクエリでそれを行うことができました。

    Quizzes.update(
      { _id: quizID, 'questions.text': questionText },
      { $pull: { questions: {text: questionText }}}
    );

(ここで説明されているとおり: http://docs.mongodb.org/manual/core/update/#Updating-ModifierOperationsの「位置を指定せずに要素を更新する」というタイトルのセクション)

私はそれを次のようなものに拡張しようとしました:

Quizzes.update(
  { _id: quizID, 'answers.text': answerText },
  { $pull: { questions: {text: questionText {answers: {text: answerText }}}}}
);

しかし、運がありませんでした。

どんなアイデアでも大歓迎です。

4

1 に答える 1

7

$pull 条件と組み合わせて位置演算子を使用します。

> db.quizzes.update(
      {_id:<quizID>, "questions.text":"This is the second question."}, 
      {$pull:{ "questions.$.answers":{"text":"Answer Toodlydoo"}}}
);

上記は、2番目の質問から2番目の回答を削除するように機能します。

于 2013-05-28T20:20:20.040 に答える