2013-03-11 17 views
6

mam w mojej kolekcji obiektów, które wyglądają jak:MongoDB tablica rekordów z wartości null

{ MyArray:[null, "some value", null] } 

chcę zapytać tych obiektów, które mają wartość null jako elementu tablicy. Nie działa zapytanie

: wydaje się, że znajduje się tylko obiekt o zerowej wartości MyArray, np.

{ MyArray:null } 

Jak mogę zdefiniować moje zapytanie?

EDIT: Proszę zobaczyć jeden z moich rzeczywistych obiektów:

{ 
     "_id" : BinData(3,"ch9PrWveqU6niB6FGVhIOg=="), 
     "PeerGroup" : "male", 
     "ProductId" : BinData(3,"weRiKOtXEUSDZHkGHLcwzw=="), 
     "CategoryIds" : [ 
       BinData(3,"BXzpwVQozECLaPkJy26t6Q=="), 
       BinData(3,"ox303ZeM50KelvoUbPBJ8Q=="), 
       BinData(3,"26ziaY+G9UKMyjmtVkkhcg=="), 
       BinData(3,"D2X8vObte0eJHNcDfp2HBw==") 
     ], 
     "ShopId" : BinData(3,"ZdfPmrlKR0GkLPC4djJuKw=="), 
     "BrandId" : BinData(3,"kCHyuyLvgECxPF1nxwr7qQ=="), 
     "Created" : ISODate("2012-08-24T07:42:12.416Z"), 
     "LastActivity" : ISODate("2013-01-14T19:38:11.776Z"), 
     "Price" : 129.9, 
     "Sale" : false, 
     "Rating" : 11.057340703605368, 
     "RatingTimed" : 0.05670431130054035, 
     "Available" : null, 
     "FreeDelivery" : null, 
     "Attrs" : [ 
       null, 
       null, 
       null, 
       null 
     ] 
} 

I wtedy zapytań przez:

db.collection.find({"Attrs":null}) 

co daje żadnych rezultatów.

+0

'> db.collection.find ({" MyArray ": null})' daje '{" _id ": ObjectId (" 513da72088ba1cdba2745f1e ")," MyArray ": [null," some value ", null]} '. Zgodnie z oczekiwaniami...? –

+0

Zapytanie powinno działać. Pokaż prawdziwe dane i zapytania pls. –

+0

Dodano prawdziwe dane i zapytanie do mojego pytania. – Max

Odpowiedz

1

Ok, zorientowałem się, ładując moich "zerowych" kandydatów przez mój sterownik C# i okazało się, że wartości nie są zerowe, ale Bson Undefined !! Są one wyświetlane jako "puste" w powłoce! Zobacz http://jira.mongodb.org/browse/SERVER-2426. to działa:

db.xxx.find({"Attrs":{$type:6}})

0

(naprawdę nie odpowiedź, ale nie pasuje do komentarza)

I nie można odtworzyć problemu, skopiowane dane do powłoki Mongo i próbowali w wersji MongoDB 2.2.3, 2.4.1 i tutaj w 2.4.0:

MongoDB wersja shell: 2.4.0 podłączenia do: badania

> db.version() 
2.4.0 
> db.xxx.insert({ 
... "_id" : BinData(3,"ch9PrWveqU6niB6FGVhIOg=="), 
... "PeerGroup" : "male", 
... "ProductId" : BinData(3,"weRiKOtXEUSDZHkGHLcwzw=="), 
... "CategoryIds" : [ 
... BinData(3,"BXzpwVQozECLaPkJy26t6Q=="), 
... BinData(3,"ox303ZeM50KelvoUbPBJ8Q=="), 
... BinData(3,"26ziaY+G9UKMyjmtVkkhcg=="), 
... BinData(3,"D2X8vObte0eJHNcDfp2HBw==") 
... ], 
... "ShopId" : BinData(3,"ZdfPmrlKR0GkLPC4djJuKw=="), 
... "BrandId" : BinData(3,"kCHyuyLvgECxPF1nxwr7qQ=="), 
... "Created" : ISODate("2012-08-24T07:42:12.416Z"), 
... "LastActivity" : ISODate("2013-01-14T19:38:11.776Z"), 
... "Price" : 129.9, 
... "Sale" : false, 
... "Rating" : 11.057340703605368, 
... "RatingTimed" : 0.05670431130054035, 
... "Available" : null, 
... "FreeDelivery" : null, 
... "Attrs" : [ 
... null, 
... null, 
... null, 
... null 
... ] 
... } 
...) 
> db.xxx.find({"Attrs":null}).pretty() 
{ 
    "_id" : BinData(3,"ch9PrWveqU6niB6FGVhIOg=="), 
    "PeerGroup" : "male", 
    "ProductId" : BinData(3,"weRiKOtXEUSDZHkGHLcwzw=="), 
    "CategoryIds" : [ 
     BinData(3,"BXzpwVQozECLaPkJy26t6Q=="), 
     BinData(3,"ox303ZeM50KelvoUbPBJ8Q=="), 
     BinData(3,"26ziaY+G9UKMyjmtVkkhcg=="), 
     BinData(3,"D2X8vObte0eJHNcDfp2HBw==") 
    ], 
    "ShopId" : BinData(3,"ZdfPmrlKR0GkLPC4djJuKw=="), 
    "BrandId" : BinData(3,"kCHyuyLvgECxPF1nxwr7qQ=="), 
    "Created" : ISODate("2012-08-24T07:42:12.416Z"), 
    "LastActivity" : ISODate("2013-01-14T19:38:11.776Z"), 
    "Price" : 129.9, 
    "Sale" : false, 
    "Rating" : 11.057340703605368, 
    "RatingTimed" : 0.05670431130054035, 
    "Available" : null, 
    "FreeDelivery" : null, 
    "Attrs" : [ 
     null, 
     null, 
     null, 
     null 
    ] 
} 

Proszę skopiować powyższą sekwencję do swojej skorupy Mongo i po wyniki tutaj.

17

W celu znalezienia dokumentów z tablic, z elementami zerowymi uruchom:

db.collection.find({"keyWithArray":{$elemMatch:{"$in":[null], "$exists":true}}}) 

Według safaribooksonline prawidłowego null dopasowania jest wykonywana przy użyciu $in (bo nie można używać $eq z null). Ponadto, porównując z null:

{"something":null} 

będzie pasował do dokumentów ze zbioru „coś” pola NULL i każdego dokumentu, który nie ma „coś” pole w ogóle. Dlatego musimy upewnić się, że klucz istnieje za pomocą $exists.

+0

C'mon @Max, to powinno być zaakceptowaną odpowiedzią tutaj. –

Powiązane problemy