2016-12-15 52 views
2

我很難理解爲什麼在處理查詢中的空值和數組索引時,mongodb發生以下情況。MongoDB在給定的位置正確地查詢數組中的'null'

假設我們有以下幾點:

> db.test.find() 
{ "_id" : ObjectId("5852da24507d8c27f4e3c357"), "item" : null } 
{ "_id" : ObjectId("5852da2d507d8c27f4e3c358"), "item" : { "something" : true } } 
{ "_id" : ObjectId("5852da33507d8c27f4e3c359") } 

當我試圖發現是空的,我得到ObjectId("5852da24507d8c27f4e3c357")ObjectId("5852da33507d8c27f4e3c359")這是基於https://docs.mongodb.com/v3.2/tutorial/query-for-null-fields/

> db.test.find({"item" : null}) 
{ "_id" : ObjectId("5852da24507d8c27f4e3c357"), "item" : null } 
{ "_id" : ObjectId("5852da33507d8c27f4e3c359") } 

預期但當我嘗試項目做同樣的事情,但在一個給定索引的數組內,這是完全不同的一組結果:

假設我們有以下G:

> db.test.find() 
{ "_id" : ObjectId("5852dbe1507d8c27f4e3c35c"), "a" : [ { "something" : true }, { "something" : true }, null ] } 
{ "_id" : ObjectId("5852dbf4507d8c27f4e3c35d"), "a" : [ { "something" : true }, { "something" : true }, { "something" : true } ] } 
{ "_id" : ObjectId("5852dbfb507d8c27f4e3c35e"), "a" : [ { "something" : true }, { "something" : true } ] } 

但如果我這樣做基於2的指數爲空的查詢,我們仍然可以返回的所有文件:

> db.test.find({"a.2": null}) 
{ "_id" : ObjectId("5852dbe1507d8c27f4e3c35c"), "a" : [ { "something" : true }, { "something" : true }, null ] } 
{ "_id" : ObjectId("5852dbf4507d8c27f4e3c35d"), "a" : [ { "something" : true }, { "something" : true }, { "something" : true } ] } 
{ "_id" : ObjectId("5852dbfb507d8c27f4e3c35e"), "a" : [ { "something" : true }, { "something" : true } ] } 

這對我來說似乎並不像其作爲工作預期?但是我們可以看到但該指數位置正常工作,我們可以做以下查詢:

> db.test.find({"a.2": {something:true}}) 
{ "_id" : ObjectId("5852dbf4507d8c27f4e3c35d"), "a" : [ { "something" : true }, { "something" : true }, { "something" : true } ] } 

這是MongoDB的內部錯誤和處理數組和空值?

+0

我不知道這是否是預期的行爲,也許是個bug,因此我創建[JIRA SERVER-27442(https://jira.mongodb.org/browse/SERVER-27442)那並不是 – styvane

回答

0

這是你如何做字段的空檢查。空的$type是10

db.test.find({ "a.2" : { $type: 10 } }) 

響應

{"_id": ObjectId("5852dbe1507d8c27f4e3c35c"),"a": [{"something": true}, {"something": true}, null]} 

同樣不空,你會做這樣的事情。

db.test.find({"a.2": { $not:{$type: 10 }}}) 
+0

回答這個問題。 'null!= {「something」:true}' – styvane

+0

但它在doc.https://docs.mongodb.com/v3.2/tutorial/query-for-null-fields/中提到用於檢查空類型。這將只返回位置爲2的空行。我認爲OP想要的是什麼。添加了答案的答案。 – Veeram

+0

問題是爲什麼會發生這種情況。 – styvane

相關問題