2016-08-25 2 views
1

Da jede Sammlung in Mongodb einen Standardindex für die Spalte _id hat, wollte ich es für mein Szenario wie unten nutzen.Verwenden MongoDB _id Feld als zusammengesetztes Feld mit mehreren Feldern

Ich habe meine Sammlung als unten,

{ 
    "_id":{ 
      "timestamp" : ISODate("2016-08-24T23:22:20.201Z"), 
      "departmentname" : "sales", 
      "city":"NJ" 
     } 

     //Other fields in my collection 
} 

Mit dieser Struktur ich in der Lage bin, wie unten abfragen,

db.getCollection('test').find(
{ 
    "_id" : { 
     "timestamp" : ISODate("2016-08-21T23:22:20.201Z"), 
     "departmentname" : "sales", 
     "city":"NJ" 
    } 
} 
) 

Aber, wenn ich durch einen oder mehrere Bereiche, in denen abfragen Teil sind von _id Säule, wie unten,

db.getCollection('test').find(
{ 
    "_id" : { 
     "timestamp" : ISODate("2016-08-21T23:22:20.201Z") 
    } 
} 
) 

(OR)

db.getCollection('test').find(
{ 
    "_id" : { 
     "departmentname" : "sales" 
    } 
} 
) 

(OR)

db.getCollection('test').find(
{ 
    "_id" : { 
     "departmentname" : "sales", 
     "city":"NJ" 
    } 
} 
) 

Ich sehe nicht irgendwelche Dokumente

zurück

Als ich mit .explain geprüft() Ich sehe, dass es Index verwendet hat, aber fanden keine Dokumente gefunden.

Außerdem würde Ich mag Datumsbereich Abfragen auf Zeitstempel-Feld zu tun, zusammen mit Abfrage auf einem oder mehreren Feldern in der _id Spalte wie unten,

db.getCollection('test').find(
{ 

    "_id.timestamp" : { 
     "$gte": ISODate("2011-08-21T23:22:20.201Z") 
    }, 
    "_id.departmentname" : "sales" 
} 
) 

Aber ich sehe keine Dokumente zurückgegeben. Wenn ich .explain() ausführe, sehe ich, dass es colscan und nicht index verwendet hat.

Kann mir jemand auf die richtige Weise helfen, nach einem oder mehreren Feldern in meiner Spalte _id abzufragen.

Danke,

Sri

Antwort

2

Sie können folgende Abfrage, in ersten Fall versuchen: -

db.getCollection('test').find(
{ 
    "_id.timestamp" : ISODate("2016-08-21T23:22:20.201Z") 
}) 

Und das für mehrere Felder:

db.getCollection('test').find(
{ 
    "_id.timestamp" : ISODate("2016-08-21T23:22:20.201Z"), 
    "_id.departmentname" : "sales", 
}) 
+0

Dank .. Das hat funktioniert . – javauser

+0

Bitte finden Sie in der Dokumentation von finden Sie auch. Froh, dass es geholfen hat. – Shrabanee

+0

Wenn ich .explain() mit der Abfrage ausführen, scheint Index auf _id-Feld nicht verwandt worden zu sein. Es hat einen Sammelscan gemacht und keinen Index benutzt. Warum sollte das so sein? – javauser

Verwandte Themen