2015-03-02 82 views
0

我在一个集合中运行一个MongoDB 3.1服务器,里面大概有160万个文档。文档看起来是这样的:MongoDB在一个庞大的数据集上返回空结果

{ 
    "_id": { "$oid" : "123456789" }, 
    "lastChange": "2015-02-09 13:22:27", 
    "startDate": "2015-02-09", 
    "receiptNumber" : 296, 
    "itemReceiptPositions": [ 
    { 
     "itemId": 900064, 
     "listPrice": 8.99 
    } 
    ] 
} 

我已经创建的“itemReceiptPositions.itemId”和“receiptNumber”索引:

{ 
    "v" : 1, 
    "key" : { 
    "receiptNumber" : 1 
    }, 
    "name" : "receiptNumber_1", 
    "ns" : "someDatabase.someCollection" 
}, 

{ 
    "v" : 1, 
    "key" : { 
    "itemReceiptPositions.itemId" : 1 
    }, 
    "name" : "itemReceiptPositions.itemId_1", 
    "ns" : "someDatabase.someCollection" 
} 

当我搜索通过itemReceiptPositions.itemId键这个特定的文件, MongoDB找不到文档:

> db.someCollection.find({ "itemReceiptPositions.itemId" : 900064 }).count() 
0 

但是,每当我搜索关键字“receiptNumber”,文档被发现!即使查询

> db.someCollection.find({ "itemReceiptPositions.itemId" : { "$gt" : 0 }}).count() 

返回零结果。怎么会这样?

这里是.explain()两个查询的输出:

> db.someCollection.find({ "itemReceiptPositions.itemId" : 900064 }).explain() 
{ 
    "queryPlanner" : { 
    "plannerVersion" : 1, 
    "namespace" : "someDatabase.someCollection", 
    "indexFilterSet" : false, 
    "parsedQuery" : { 
     "itemReceiptPositions.itemId" : { 
     "$eq" : 900064 
     } 
    }, 
    "winningPlan" : { 
     "stage" : "FETCH", 
     "inputStage" : { 
     "stage" : "IXSCAN", 
     "keyPattern" : { 
      "itemReceiptPositions.itemId" : 1 
     }, 
     "indexName" : "itemReceiptPositions.itemId_1", 
     "isMultiKey" : true, 
     "direction" : "forward", 
     "indexBounds" : { 
      "itemReceiptPositions.itemId" : [ 
      "[900064.0, 900064.0]" 
      ] 
     } 
     } 
    }, 
    "rejectedPlans" : [ ] 
    }, 
    "serverInfo" : { 
    "host" : "someHost", 
    "port" : 1234, 
    "version" : "3.1.0-pre-", 
    "gitVersion" : "bbd95ca6a8b538b4cffece0b9d9c3ed811a455a7" 
    }, 
    "ok" : 1 
} 

> db.someCollection.find({ "receiptNumber" : 296 }).explain() 
{ 
    "queryPlanner" : { 
    "plannerVersion" : 1, 
    "namespace" : "someDatabase.someCollection", 
    "indexFilterSet" : false, 
    "parsedQuery" : { 
     "receiptNumber" : { 
     "$eq" : 296 
     } 
    }, 
    "winningPlan" : { 
     "stage" : "FETCH", 
     "inputStage" : { 
     "stage" : "IXSCAN", 
     "keyPattern" : { 
      "receiptNumber" : 1 
     }, 
     "indexName" : "receiptNumber_1", 
     "isMultiKey" : false, 
     "direction" : "forward", 
     "indexBounds" : { 
      "receiptNumber" : [ 
      "[296.0, 296.0]" 
      ] 
     } 
     } 
    }, 
    "rejectedPlans" : [ ] 
    }, 
    "serverInfo" : { 
    "host" : "someHost", 
    "port" : 1234, 
    "version" : "3.1.0-pre-", 
    "gitVersion" : "bbd95ca6a8b538b4cffece0b9d9c3ed811a455a7" 
    }, 
    "ok" : 1 
} 

回答

1

您需要使用查询运算符$elemMatch

db.someCollection.find({ "itemReceiptPositions" : {$elemMatch: {"itemId" : 900064}}}) 
+0

你怎么办?你确定吗? – Sammaye 2015-03-02 14:30:35

+0

点符号工作得很好 – lascort 2015-03-02 14:32:50

+0

@ZeMoon:谢谢,但这并没有解决它:(它仍然没有找到任何文件 – soner 2015-03-02 14:39:13

0

AH!发现它!

您错误地大写的E,并在那里也增加了额外的P,请检查您的解释查询:

db.someCollection.find({ "itemREceiptPopsitions.itemId" : 900064 }).explain() 

itemREceiptPopsitions... 
    ^ ^

在原始查询过

作为一个侧面说明你可能犯这样的错误,您的查询工作正常,我在try.mongodb.org检查,看看自己:

enter image description here

+0

谢谢,但这是我在StackOverflow中输入查询时发生的打字错误,我复制并粘贴了针对数据库运行的实际查询,我仔细检查了我针对MongoDB运行的查询,但没有输入错误,但感谢提示;) /编辑:您是否编入了itemId? – soner 2015-03-02 14:37:40

+0

nope,据我所知,mongodb小提琴不会让你创建索引。我怀疑索引是否会产生任何问题。 – lascort 2015-03-02 14:45:57

+1

它可能是一个损坏的索引。你可以用'.hint({“$ natural”:1})'来强制执行查询吗? – wdberkeley 2015-03-02 18:45:03