4

通常、MongoDB ではプロパティ名にドットを使用できません。例えば:

db.books.insert({"protagonist.name": "Guy Montog"});

次のエラーで失敗します。

uncaught exception: can't have . in field names [protagonist.name]

しかし、プロパティ名にドットが含まれている状況に出くわしました。これは、system.profile コレクションで発生する可能性があります。次に例を示します。

db.setProfilingLevel(2);
db.books.insert({protagonist: "Guy Montog", antecedents: 
  [{title: "The Fireman"}, {title: "Bright Phoenix"}]});
db.books.find({"antecedents.title": "The Fireman"})

system.profile コレクションを見ると、次のレコードが表示されます。

> db.system.profile.findOne({op: "query"})
{
    "ts" : ISODate("2012-10-14T00:05:49.896Z"),
    "op" : "query",
    "ns" : "wordswing.books",
    "query" : {
        "antecedents.title" : "The Fireman"
    },
    "nscanned" : 1,
    "nreturned" : 1,
    "responseLength" : 153,
    "millis" : 0,
    "client" : "127.0.0.1",
    "user" : ""
}

「antecedents.title」を照会する for system.profile ドキュメントを照会したいとします。プロパティ名にドットがあるので、これは問題のようです。

私は次のすべてを試しました:

db.system.profile.find({'query.antecedents.title': 'The Fireman'})
db.system.profile.find({'query.antecedents\.title': 'The Fireman'})
db.system.profile.find({"query.antecedents\.title": 'The Fireman'})

どれもうまくいきませんでした。

アイデア?

これは、かなり大きな system.profile コレクションをいじる私の能力を実際に妨げています。

前もって感謝します。

アップデート

コメントに応じて、私が使用しているバージョンは次のとおりです。

$ mongod --version
db version v2.0.6, pdfile version 4.5
Sun Oct 14 18:43:29 git version: e1c0cbc25863f6356aa4e31375add7bb49fb05bc

ケビン

4

1 に答える 1

3

ドット クエリのプロファイル エントリはバグのようです。MongoDB のキー名には、含める.(または先頭に . を付ける$) ことは意図されていません。

お気付きのように、埋め込みオブジェクトを示すためにドット表記が使用されているため、クエリを実行しようとすると問題が発生します。

MongoDB 2.2.0 での限定的な回避策は、Aggregation Framework を使用してクエリ オブジェクトを埋め込みドキュメントとして照合することです。

db.system.profile.aggregate({ $match: {'query': {"antecedents.title" : "The Fireman"}}})

このプロファイリングのバグを MongoDB の問題トラッカーでSERVER-7349として報告しました。

于 2012-10-14T02:28:22.467 に答える