2017-04-24 8 views
0

コレクションを等しく文書を見つけます。この例では、nullと指定した場合、arr : [null, null, null]の文書が必要です。MongoDBは、すべての配列要素がいくつかの値

Find documents where ALL elements of an array have a specific value

このソリューションは、私が欲しいものに近いです。しかし、私の配列データには$elemMatchが参照するためのキーがありません。不必要にコストがかかり、データを再構築せずにこのクエリを実行する方法はありますか?

ありがとうございます!

+0

ここでもよく似た質問があります。http://stackoverflow.com/questions/23595023/check-if-every-element-in-array-matches-condition – Veeram

答えて

0

あなたは$elemMatchクエリ演算子を使用することができます。ただクエリが必要です。

db.test.find({ arr: { $not: { $elemMatch: { $ne: null } } } }) 

"$elemMatch" + "$ne"

この部分はarr配列は少なくとも一つのヌル値を持たないすべての文書が含まれています。

これらはすべて、少なくとも1つのヌル値を持つ文書です。

$not

この部分は"$elemMatch" + "$ne"に含まれていないすべての文書を維持します。

これらはすべて、すべての値がnullであるすべてのドキュメントです。

フィールドが存在しない場合がありますので、正常に動作することを確認してください。

+0

これはarrの存在とサイズのチェックを追加して動作するようです。ありがとう! – Chris

0

演算子は$allですが、セマンティクスは正確には意味がない場合があります。

db.test.find({ arr: { $all: [null] } }) 

これは両方のテストドキュメントを返します。

あなたが本当に3つのNULL値を持つ配列を照会したい場合は、あなただけの配列リテラルを照会することができます

db.test.find({arr:[null,null,null]}) 
+0

'$ all'演算子は正しいと思われますいずれかの値が 'null'(' arr'自体を含む)であればリターンします。残念ながら、配列にはどれだけの値があるかは不明なので、比較のためにリテラル配列を作成することはできません。 – Chris

+0

これは奇妙な要求のようです。たぶん別の解決策があります。あなたのユースケースと事例に関する詳細を共有できますか? – helmy

+0

簡単に言えば、配列内に同種のデータを持つ文書をフィルタリングできる必要があります。たとえば、driver1とdriver2にdb.driversに次のエントリがあるとします: '{_id:" driver1 "、record:[" win "、" win "、" win "]}、{_id:" driver2 "、record: ["win"]} '。このデータがあれば、完全なレコードを持つすべてのドライバについてdb.driversをクエリしたいと思います。この場合、両方のレコードが返されます。 – Chris

関連する問題