2013-03-11 21 views
6

ich Objekte in meiner Sammlung haben, die wie folgt aussehen:MongoDB Abfrage Array mit Nullwerten

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

ich diese Objekte abfragen möchten, die einen Nullwert als ein Array-Element haben. Die Abfrage

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

funktioniert nicht, es scheint nur die Objekte zu finden, bei denen MyArray null ist, z.

{ MyArray:null } 

Wie muss ich meine Abfrage definieren?

EDIT: Bitte sehen eine meiner realen Objekte:

{ 
     "_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 
     ] 
} 

Und dann abfragen ich nach:

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

, die keine Ergebnisse liefert.

+0

'> db.collection.find ({" MyArray ": null})' gibt '{" _id ": ObjectId (" 513da72088ba1cdba2745f1e ")," MeinArray ": [null," irgendein Wert ", null]} '. Wie erwartet...? –

+0

Abfrage sollte funktionieren. Zeige dir echte Daten und frage pls. –

+0

Zu meiner Frage wurden echte Daten und eine Abfrage hinzugefügt. – Max

Antwort

1

Ok, ich habe es herausgefunden, indem ich meine "Null" Kandidaten über meinen C# Treiber geladen habe und es stellt sich heraus, dass die Werte nicht null sind, aber Bson Undefined !! Sie werden in der Shell als "null" angezeigt! Siehe http://jira.mongodb.org/browse/SERVER-2426. Dies funktioniert:

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

0

(nicht wirklich eine Antwort, aber passt nicht in einem Kommentar)

ich nicht das Problem reproduzieren, kann ich Ihre Daten an das Mongo Shell kopiert und versucht, in MongoDB Versionen 2.2.3, 2.4.1 und hier in 2.4.0:

MongoDB Shell-Version: 2.4.0 Anschluss an: Test

> 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 
    ] 
} 

bitte die obige Sequenz auf Ihre mongo Shell kopieren und die Ergebnisse hier posten.

17

Um Dokumente mit Arrays zu finden, die mit null Elementen bitte ausführen:

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

Nach safaribooksonline richtigen null Anpassung wird mit $in ausgeführt (weil Sie nicht $eq verwenden können mit null). Auch den Vergleich mit null:

{"something":null} 

passen auf Dokumente mit „etwas“ Feld auf null gesetzt und jedes Dokument, das nicht „etwas“ Feld überhaupt nicht hat. Daher müssen wir sicherstellen, dass der Schlüssel mit $exists existiert.

+0

Komm schon @Max, das sollte die akzeptierte Antwort hier sein. –