配列フィールドにMongoDBの一意の値または別の配列が含まれているかどうかを確認するにはどうすればよいですか?


143

現在、mongodbを使用しています。

私はブログ投稿コレクションを持っています、そしてブログ投稿は配列であるファイルされたタグを持っています、例えば

blogpost1.tags = ['tag1', 'tag2', 'tag3', 'tag4', 'tag5']
blogpost2.tags = ['tag2', 'tag3']
blogpost3.tags = ['tag2', 'tag3', 'tag4', 'tag5']
blogpost4.tags = ['tag1', 'tag4', 'tag5']

これらの検索を行うにはどうすればよいですか

  1. 「tag1」を含む
  2. ['tag1'、 'tag2']を含む
  3. ['tag3'、 'tag4']のいずれかを含む

回答:


219

これを試してください:

db.blogpost.find({ 'tags' : 'tag1'}); //1
db.blogpost.find({ 'tags' : { $all : [ 'tag1', 'tag2' ] }}); //2
db.blogpost.find({ 'tags' : { $in : [ 'tag3', 'tag4' ] }}); //3

6
これはよくヘルプに記載されていますmongodb.org/display/DOCS/...
スコット・ヘルナンデスを

2
$ allの場合、それはすべての要素を意味し、かつ表現された順序であるか、それとも単に順序付けされていないのですか?
redben

2
@ScottHernandez検索で使用しているフィールドが配列になる可能性があること、およびその処理方法について彼らが言及していることはわかりません。"フィールド:{$ in:配列}"。配列の配列内で配列を検索するとどうなりますか?指定されていない。
Zut

複製を停止するために配列に対して行うことができるINDEXINGはありますか?はいの場合は、方法をご案内ください。
Hitesh Joshi 2012

1
@redbenはドキュメントに書かれているように順序付けされていません:$ all operator DOCS。例の部分を読むだけで、表示されます。
Matthias B

5

私の経験では、(2)の場合、次の解決策は "$ all"の解決策よりもはるかに高速です。

db.blogpost.find({ $and: [ {tags: 'tag1'} ,{tags: 'tag2'} ] });

正直なところ、理由はわかりません。誰かが知っていれば、私は興味があります。


1
ちなみに、インデックス付きキーワードリストでテストしたところです。$ andと$ allを使用してもまったく同じ結果になります
isox

多分それはその間に新しいバージョンで変わった。
heinob 2013

それは状況によるものです。「$ and」の場合、mongodbは論理的な「and」演算を行います。したがって、最初の式が偽の場合、2番目の式は考慮されません。つまり、処理が少なくなります。
kubudi 2013年

しかし、それは '$ all'でも起こるはずですよね!?
heinob 2013年

1
$ allはおそらくインデックスの2つのルックアップであり、$ andはおそらく結果の順次スキャンによる1つのルックアップです。
エヴァンキャロル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.