MongoDB –配列/リストのサイズがNより大きいすべてのドキュメントを検索します
次のドキュメントを確認します。
コレクション:ドメイン
{ "_id" : 1001, "domainName" : "google.com" "tag" : [ "search engine", "search", "find anything", "giant" ] }, { "_id" : 1002, "domainName" : "yahoo.com" "tag" : [ "search engine", "online portal", ] }, { "_id" : 1003, "domainName" : "example.com" }
1. 質問
「タグ」サイズが3より大きいすべてのドキュメントを見つける方法
#1.1次のように$size
と$gt
を組み合わせてみてください:
db.domain.find( { tag: {$size: {$gt:3} } } ); null
エラーはありませんが、常にnullを返します。MongoDBはこのように機能しないようです。
#1.2$where
演算子を使用してみてください。
db.domain.find( {$where:'this.tag.length>3'} ) MongoDB v 2.2.3 uncaught exception: error { "$err" : "error on invocation of $where function:\nJS Error: TypeError: this.tag has no properties nofile_a:0", "code" : 10071 } or MongoDB v 2.4.5 JavaScript execution failed: error: { "$err" : "JavaScript execution failed: TypeError: Cannot read property 'length' of undefined near '' ", "code" : 16722 } at src/mongo/shell/query.js:L128 >
$where
演算子も機能していないように見えますか?
2. 溶液
実際には、$where
演算子は正常に機能していますが、すべてのドキュメントに「タグ」フィールドが含まれているわけではなく、「プロパティなし」エラーが発生しました。
2.1 To fix it, try combine $exists
and $where
together :
db.domain.find( {tag : {$exists:true}, $where:'this.tag.length>3'} ) { "_id" : 1001, "domainName" : "google.com" "tag" : [ "search engine", "search", "find anything", "giant" ] }