2017-04-05 11 views
1

特定のフィールドが特定の文字列に含まれているドキュメントを照会することは可能ですか?MongoDB - フィールド値が指定された文字列に含まれているかどうかを調べる

{a: 'test blabla'}, 
{a: 'test not'} 

私はそうのみ最初の文書がを返される、aは完全に文字列"test blabla test"に含まれているフィールドのすべての文書を検索したいと思います。たとえば

は、私はこれらの文書を持っている場合。

私はで$indexOfCPを使用してこれを行うことができますが、$wheremapReduceを使用しても可能です。標準のMongoDB演算子(例:$ gt、$ in)を使用してfindクエリを実行することができれば、私は迷っていました。

ありがとうございました。

+0

'{「テスト」} 'も' 'テストblablaテスト' 'に完全に含まれています。あなたが一番近い試合を探していますか? – Veeram

+0

@Veeram申し訳ありませんが、文書を修正しました。 (それはまた、私にとって紛らわしいです:D) – TomG

+1

このための機能要求がまだ開いているhttps://jira.mongodb.org/browse/SERVER-13902 – JohnnyHK

答えて

0

正規表現を使用して検索することができます。

db.company.findOne({"companyname" : {$regex : ".*hello.*"}}); 
+0

文字列がフィールドに含まれている場合、これは、arroundの他の方法です。 – TomG

0
私はあなたがこれを行うことができ、2つの方法を考えることができ

db.someCol.find({ $where: function() { return "test blabla test".indexOf(this.a) > -1; } } 

はの説明:値がすべてのドキュメントを検索$を使用して

オプション1

指定された文字列の中にフィールド "a"があります。

このアプローチは普遍的です。好きなコードを実行できますが、パフォーマンスの観点からはあまり推奨されません。たとえば、索引を利用することはできません。ここに配慮フル$読む:https://docs.mongodb.com/manual/reference/operator/query/where/#considerations

オプション2

は、特定の状況でのみ、正規表現マッチングの策略を使用します。下記の専用フィールドの値が与えられた文字列の先頭部分文字列として発見されたことを一致して動作することの例である:

db.someCol.find({ a : /^(t(e(s(t((b(l(a(b(l(a((t(e(s(t)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?$/ }) 

を説明:あなたの「-含まれるべき-内」のコンポーネントを破ります正規表現でそのすべての可能性を照合します。

あなたのケースでは、このオプションはかなり狂っていますが、それぞれの文字を分割する必要がない特定のケース(限定された名前空間のマッチングなど)があるかもしれないので注意する価値があります。所定の部品。そして、その場合には、このオプションはまだ限り、正規表現の複雑さは、その利益を上回っていないと(インデックスを利用して、および$どこパフォーマンスpentaltiesを受けることができませんでした:)

+0

ありがとう、しかし、私が質問で言ったように、 '$ where'と' 'aggregate''との他の可能性で可能であることは分かっています。標準のMongoDBオペレータを使用することが可能かどうかを知りたかったのです。 – TomG

+0

オプション2のバリエーションが特定のケースに合わせて調整されています。さもなければ、JohnnyHKによって将来言及される機能要求。 GL – Ciabaros

関連する問題