1. ホーム
  2. mongodb

[解決済み] 配列フィールドが空でない MongoDB レコードを検索する

2022-02-07 02:33:39

質問

私のすべてのレコードには、"pictures"というフィールドがあります。このフィールドは、文字列の配列です。

私は今、この配列が空でない最新の10レコードが欲しいです。

ググってみたのですが、不思議とこれに関する情報はあまりありません。 私は$whereオプションについて読みましたが、それはネイティブ関数に対してどれくらい遅いのか、そしてより良い解決策があるのか疑問に思っていました。

それでもうまくいきません。

ME.find({$where: 'this.pictures.length > 0'}).sort('-created').limit(10).execFind()

何も返しません。退出 this.pictures 長さビットなしで動作しますが、当然ながら空のレコードも返されます。

解決方法は?

キーがないドキュメントもある場合、使用することができます。

ME.find({ pictures: { $exists: true, $not: {$size: 0} } })

MongoDB は、以下の場合はインデックスを使用しません。 $size が含まれるため、ここではより良い解決策を紹介します。

ME.find({ pictures: { $exists: true, $ne: [] } })

プロパティが無効な値を持つ可能性がある場合(例えば null boolean など)、さらにチェックを追加します。 を使って $types 提案どおり この回答では :

mongo >=3.2とのこと。

ME.find({ pictures: { $exists: true, $type: 'array', $ne: [] } })

mongoで < 3.2:

ME.find({ pictures: { $exists: true, $type: 4, $ne: [] } })

MongoDB 2.6 リリース以降では、演算子と比較できるようになりました。 $gt しかし、これは予期しない結果につながる可能性があります(詳しい説明は この回答で ):

ME.find({ pictures: { $gt: [] } })