2012-04-03 29 views
5

Khi tôi phát hành các truy vấn sau đây:

db.users.find({"pic.status" : {$ne : null} }, {"pic" : 1}).toArray() 

Tôi hy vọng sẽ nhận được tất cả người dùng có pic.status là KHÔNG null. Tuy nhiên, kết quả thực tế trông giống như sau:

{                                  
    "_id" : ObjectId("4f1e1ab9cdf9dbaa160000bf"), 
    "pic" : { 
     "id" : "4f1e1ab9cdf9dbaa160000be",                                                                              
     "status" : null 
    } 
}, 
{ 
    "_id" : ObjectId("4f1e28480eaf38193d00006f"), 
    "pic" : { 
     "id" : "4f1e28480eaf38193d00006e",                                                                              
     "status" : null 
    } 
} 

Tức là, tôi nhận người dùng có pic.status KHÔNG. Làm thế nào tôi có thể sửa lỗi này?

Trả lời

2

Tôi dường như không thể tái tạo điều này. Bạn đang sử dụng phiên bản Mongo nào? (Tôi đang sử dụng 2.1.1 trước) Dưới đây là các bước mà tôi đã thực hiện. Sau đây là từ vỏ JS:

> db.users.save({                                  
    "_id" : 1, 
    "pic" : { 
     "id" : "4f1e1ab9cdf9dbaa160000be",                                                                              
     "status" : null 
    } 
}); 
> db.users.save({ 
    "_id" : 2, 
    "pic" : { 
     "id" : "4f1e28480eaf38193d00006e",                                                                              
     "status" : null 
    } 
}); 
> db.users.save({ 
    "_id" : 3, 
    "pic" : { 
     "id" : "4f1e28480eaf38193d00006e",                                                                              
     "status" : "Something" 
    } 
}); 
> db.users.find({"pic.status":{$ne:null}}, {pic:1}).toArray() 
[ 
    { 
     "_id" : 3, 
     "pic" : { 
      "id" : "4f1e28480eaf38193d00006e", 
      "status" : "Something" 
     } 
    } 
] 

Chỉ tài liệu chứa "pic.status": "Cái gì đó" được trả về.

Suy nghĩ duy nhất của tôi là, bạn có chắc chắn rằng giá trị của (null) trong truy vấn giống như những gì được lưu trong tài liệu không? Các tài liệu được lưu bằng cách sử dụng trình bao JS hay chúng được lưu bằng trình điều khiển bằng một ngôn ngữ khác? Về mặt lý thuyết, null, phải là null, phải là null, bằng bất kỳ ngôn ngữ nào, nhưng tôi biết rằng các ngôn ngữ khác nhau đại diện cho "không có giá trị" khác nhau. Trong trăn, ví dụ, giá trị cho "không có giá trị" là (Không). (null) không được nhận dạng trong python.

Trong một vỏ python, tôi đã cố gắng để lưu một tài liệu với (null) là một giá trị, nhưng không nhận được một lỗi:

In [13]: coll.save({"_id":5, "pic":{"id":5, "status":null}}) 
--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
/Users/mbastien/mongodb-osx-x86_64-2.0.1/bin/<ipython-input-13-1ad232456c88> in <module>() 
----> 1 coll.save({"_id":5, "pic":{"id":5, "status":null}}) 

NameError: name 'null' is not defined 

sau đó tôi chèn (với vỏ Python) trạng thái 'null' ('null' là một chuỗi)

In [15]: coll.save({"_id":5, "pic":{"id":5, "status":'null'}}) 
Out[15]: 5 

Không ngạc nhiên, khi tôi reran truy vấn trong vỏ JS, tài liệu này được trả lại, bởi vì 'null'! = null

> db.users.find({"pic.status":{$ne:null}}, {pic:1}).toArray() 
[ 
    { 
     "_id" : 3, 
     "pic" : { 
      "id" : "4f1e28480eaf38193d00006e", 
      "status" : "Something" 
     } 
    }, 
    { 
     "_id" : 5, 
     "pic" : { 
      "status" : "null", 
      "id" : 5 
     } 
    } 
] 

Điều này có giống với những gì bạn đang gặp phải hay bạn có thể sao chép 100% này trong trình bao JS không? Hy vọng rằng, chúng tôi sẽ có thể nhận được vào thư mục gốc của vấn đề này!

+0

Chỉ muốn nói rằng tôi đã có thể "tái tạo" điều này trong quá trình cài đặt của riêng tôi. Tôi đã sử dụng mapReduce để tạo một bộ sưu tập. Khi tôi chạy: 'db.analysis.find ({'value.ds': {$ exist: true}, 'value.ds ': {$ ne: null}}) 'Tôi được chào đón với ' {"_id": "", "giá trị": {"ds": null, "ro": null}} {"_id ":" 00003262a3a6c8b50b470f4021812aef13e079a89756dcafbc5efa1168632548 "," giá trị ": {" ds ": null," ro ": null}} {" _id ":" 0000ddd5f3845f44631651719c846c42dffe7001816c53a7aa8814b1d61c1017 "," value ": {" ds ": null," ro ": null }} ' – awshepard

+0

Sự cố đã biến mất sau khi tôi cài đặt lại Mongo. Không chắc chắn những gì có thể đã gây ra nó. Tôi chắc chắn nó là một giá trị null đúng, nhưng cảm ơn Marc trả lời. Ví dụ đầu tiên của bạn hoạt động hoàn hảo cho tôi ngay bây giờ. –

0

Sử dụng $ nin với một phần tử duy nhất trong mảng. Nó sẽ hoạt động như bạn mong đợi. KI với nhiều người sử dụng mongo.

4

Tôi biết đó là câu hỏi cũ và có thể không còn liên quan nữa, nhưng vì không có câu trả lời được chấp nhận, tôi nghĩ tôi sẽ bình luận cho bất kỳ ai đang tìm câu trả lời.

Tôi đã có thể tạo lại sự cố trên phiên bản MongoDB 2.4.9.

> db.sourceListings.findOne({displayed:{$ne:null}}); 
{ 
    <.. other stuff went here..> 
    "displayed" : null 
} 

Vấn đề biến mất trên bản 2.6.1:

> db.sourceListings.findOne(); 
{ 
    <.. other stuff ..> 
    "displayed" : null 
} 
> db.sourceListings.findOne({displayed:{$ne:null}}); 
null 

lẽ đã được cố định ở đâu đó ở giữa hai phiên bản.

+0

Cảm ơn. Đó là khá cẩu thả của 10gen. Bạn sẽ nghĩ rằng họ sẽ có các bài kiểm tra đơn vị để bao quát những điều cơ bản này. – UpTheCreek

Các vấn đề liên quan