2015-11-08 21 views
3

我试图从相当简单的查询中获得解释。它采用的帖子收集与下面的模式:

> db.posts.findOne() 
{ 
     "_id" : ObjectId("55236e6182bf196454a952b6"), 
     "Content" : "wuOfCjKborHcxkoyXzXiW", 
     "CreatedAtUtc" : ISODate("2014-01-18T23:59:30.023Z"), 
     "Tags" : [ 
       "sjM", 
       "Van", 
       "Orm" 
     ], 
     "Title" : "msAQAbQwAl", 
     "Author" : "yIIhato", 
     "Comments" : [ ] 
} 

查询我想解释的是:

db.posts.find({ $query: {}, $orderby: { "CreatedAtUtc" : -1 } }) 

它产生正确的结果没有任何错误。但是当我想解释它时会引发异常。我已经试过这些命令解释查询:

db.posts.explain().find({ $query: {}, $orderby: { "CreatedAtUtc" : -1 } }) 
db.posts.find({ $query: {}, $orderby: { "CreatedAtUtc" : -1 } }).explain() 

var cursor = db.posts.find({ $query: {}, $orderby: { "CreatedAtUtc" : -1 } }) 
cursor.explain() 

的错误是总是相同的:

2015-11-08T16:20:40.137+0100 E QUERY Error: explain failed: { "ok" : 0, "errm 
sg" : "unknown top level operator: $query", "code" : 2 } 
    at Error (<anonymous>) 
    at Function.throwOrReturn (src/mongo/shell/explainable.js:34:19) 
    at constructor.finish (src/mongo/shell/explain_query.js:188:36) 
    at DBQuery.explain (src/mongo/shell/query.js:434:25) 
    at (shell):1:8 at src/mongo/shell/explainable.js:34 
> 
+0

您正在使用哪种MongoDB版本? – chridam

+0

@chridam v3.0.7 – Landeeyo

回答

5

docs

不要混合使用的查询表格。如果使用$query格式,请不要将 游标方法附加到find()。要修改查询,请使用元运算符 ,如$explain

因此,下面的两个操作是等价的:

你的情况
db.collection.find({ $query: { age : 25 }, $explain: true }) 
db.collection.find({ age : 25 }).explain() 

因此,随着$explain运营商已经从3.0版本弃用,请查询类似的后一种形式:

db.posts.find({}).sort({ "CreatedAtUtc" : -1 }).explain();