如何查询带有点的属性?

时间:2012-10-14 00:17:14

标签: mongodb

通常,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

凯文

1 个答案:

答案 0 :(得分:2)

虚线查询的配置文件条目似乎确实是一个错误.MongoDB中的key names并不包括.(或前导$)。

正如您所注意到的,这会在尝试查询时出现问题,因为dot notation用于表示嵌入对象。

MongoDB 2.2.0中的一个有限的解决方法似乎是使用聚合框架将查询对象与嵌入文档相匹配:

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

我已将MongoDB问题跟踪器中的此分析错误报告为SERVER-7349