2017-05-28 10 views
0

私はMongoDBを学んでいます。私は、スキーマ以下のようにコレクションを持っている「$」 の使用に混乱:

{ 
    _id: 1, 
    "name": "test", 
    "city": "gr", 
    "sector": "IT", 
    "salary":1000 
} 

私は、クエリの下に実行する上での出力の下に見つける:

Query         Result 

db.user.find({salary:2000});   Works 
db.user.find({$salary:2000});   does not work(unknown top level operator: $salary) 
db.user.aggregate({$group:{_id:null,avg:{$avg:"$salary"}}}); Works 
db.user.aggregate({$group:{_id:null,avg:{$avg:$salary}}}); does not work($salary is not defined) 
db.user.aggregate({$group:{_id:null,avg:{$avg:"salary"}}}); gives wrong output. 

誰の構文意義は何か、説明していただけますmongoDBには ""と$があります。

答えて

4

こんにちはfindため、このを見てみましょうこれらのクエリ

1- db.user.find({salary:2000});   
2- db.user.find({$salary:2000}); 

を見てみましょう。 findによると、{field:value}は給与が有効なフィールドであるため、最初のクエリが機能します。何のフィールド$給与集約のための

3- db.user.aggregate({$group:{_id:null,avg:{$avg:"$salary"}}}); 
4- db.user.aggregate({$group:{_id:null,avg:{$avg:$salary}}}); 
5- db.user.aggregate({$group:{_id:null,avg:{$avg:"salary"}}}); 

がないbecuase あなたの2番目のクエリは動作しません、この$avgを見てみましょう。 ここで、$ avgは{$ avg:expression}を取ると言います。だからあなたは実際にそこにフィールドを置かずに表現を維持している。

ここでexpressionをご覧ください。 式には、フィールドパスとシステム変数、リテラル、式オブジェクト、および式演算子を使用できます。

クエリ番号3,4,5は、式オブジェクトまたは式演算子ではありません。だからこれらのオプションを排除することができます。

ここで$literalを見てみましょう。 リテラルはどのような型でもかまいませんが、MongoDBはフィールドへのパスとしてドル記号で始まるリテラルを解析します。

最後にField Path and System variablesをご覧ください。 "フィールドパスを指定するには、ドル記号$で始まる文字列を使用します。たとえば、ユーザーフィールドのフィールドパスを指定する" $ user "またはフィールドを指定する" $ user.name " "user.name"フィールドへのパス "

つまり、$ salgを$ avg: "$ salary"のフィールドへのパスとして指定し、クエリ番号3が機能します。

$ salaryが無効な式であるため、クエリ番号4が機能しません。

これは、再びそれが平均化する任意のフィールドを見つけることができませんので、「

問合せ番号5が動作していない」の重要性を説明する必要があります。それは有効なクエリのため単に動作しますが、nullを返します。 あなたが

db.user.aggregate({$group:{_id:null,avg:{$avg:"some_non_existent_field"}}}); 

を持っていた可能性があり、クエリがまだ正常に動作しますが、あなたはあなたの結果のためにnullを取得します。 私はこれが助けてくれることを願っています。これはたくさんの楽しいものでした。

関連する問題