4

この質問では、JefftheBearが配列を使用してドキュメントを検索する方法を説明しました

contains 'tag1'
contains ['tag1','tag2'],
contains any of ['tag3', 'tag4']

しかし、別の配列の一部である配列を使用してドキュメントを検索する場合はどうすればよいですか?

post1.tags = ['tag1']
post2.tags = ['tag1','tag3']
post3.tags = ['tag2','tag4']
post4.tags = ['tag1','tag2','tag3','tag4']

タグがあるのでpost1とpost3を取得したい

contained in ['tag1', 'tag2', 'tag4']

tag3がに存在しないため、post2とpost4を取得したくありません['tag1', 'tag2', 'tag4']

つまり、タグ配列内のすべての要素が別の条件付き配列で見つかる投稿を選択します

4

3 に答える 3

5

これを行うには、集約フレームワークを使用できます。次のデータが与えられた

> db.post.find()
{ "_id" : 1, "tags" : [ "tag1" ] }
{ "_id" : 2, "tags" : [ "tag1", "tag3" ] }
{ "_id" : 3, "tags" : [ "tag2", "tag4" ] }
{ "_id" : 4, "tags" : [ "tag1", "tag2", "tag3", "tag4" ] }

集計クエリ

db.post.aggregate({
  $project: {
    _id: 1,
    tags: 1,
    killFlag: {
      $const: [true, false]
    }
  }
}, {
  $unwind: "$tags"
}, {
  $unwind: "$killFlag"
}, {
  $match: {
    $nor: [{
        tags: {
          $in: ['tag1', 'tag2', 'tag4']
        },
        killFlag: true
      }
    ]
  }
}, {
  $group: {
    _id: "$_id",
    tags: {
      $addToSet: "$tags"
    },
    killFlag: {
      $max: "$killFlag"
    }
  }
}, {
  $match: {
    killFlag: false
  }
}, {
  $project: {
    _id: 1,
    tags: 1
  }
})

あなたに与えるだろう

{
  "result": [{
      "_id": 3,
      "tags": [
          "tag4",
          "tag2"
      ]
    }, {
      "_id": 1,
      "tags": [
          "tag1"
      ]
    }
  ],
  "ok": 1
}
于 2013-03-26T22:57:49.440 に答える
4

7年後...私はこのトピックに基づいてこの解決策を見つけました。

パフォーマンスの面で優れたソリューションかどうかはわかりませんが、受け入れられているソリューションよりもクリーンに見えます。

db.collection.find({
  tags: {
    "$not": {
      "$elemMatch": {
        "$nin": [
          "tag1",
          "tag2",
          "tag4"
        ]
      }
    }
  }
})
于 2020-08-12T15:38:05.333 に答える
1

私にも同様の仕事があり、何が私のために働いているのか:

db.collection.find({ tags: { "$all":[ tag1", tag2", "tag4"] }})

おそらく誰かにとって、これはドキュメントhttps://docs.mongodb.com/manual/tutorial/query-arrays/#specify-multiple-criteria-for-array-elementsにある便利なソリューションになります

于 2020-10-22T17:33:18.267 に答える