$ endeksi kullanmaz var, ancak
photos: [
{id:123, url: '...', title: '...', ... },
{id:456, url: '...', title: '...', ... },
...
]
için veri yapısını değiştirmek ve daha sonra fotoğraf kimliği için dizin oluşturmak için
db.users.ensureIndex({photos.id:1})
kullanabilirsiniz.
yanlış mıyım görünüyor, aslında, sizin $ zorlayabilir endeksinizi kullanmak için sorguyu bulunmaktadır. Yukarıdaki yapıyı kullanmaya devam edelim, ancak fotoğraf kimliğiniz kesinlikle belirtilmiyor, yani bazı dokümanlarda 'id' anahtarına sahip olacak ve bazıları olmayacak. Sonra üzerine seyrek endeksi oluşturabilirsiniz:
db.users.ensureIndex({'photos.id': 1}, {'sparse': true})
sonra böyle sorgulamak:
db.users.find({'photos.id': {$exists: true}}).hint({'photos.id': 1})
sorgu dizini kullanarak olup olmadığını görmek için açıklamak ekleyebilir. İşte benim sonucudur, benim koleksiyonun mobil anahtarı photos.id benzer: yardımcı
> db.test.count()
50000
> db.test.find({'mobile': {$exists: true}}).hint({'mobile': 1}).explain()
{
"cursor" : "BtreeCursor mobile_1",
"nscanned" : 49999,
"nscannedObjects" : 49999,
"n" : 49999,
"millis" : 138,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"mobile" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
}
}
> db.test.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "test.test",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"mobile" : 1
},
"ns" : "test.test",
"name" : "mobile_1",
"sparse" : true,
"background" : true
}
]
Umut!
vardır. – bantic
NO !!! Ben mongodb 2.4.3 ile test ettim ve endeksi kullanır. Varolmayan alanların, dizinde Null değerine sahip olduğunu unutmayın. –
MongoDB 3.0.3: 'açıkla' bul ({field: {$ exists: 1}}) 've' find ({field: {$ ne: null}}) 'indeksi kullanacak gibi görünüyor ama ikinci sorgu anında biterse, ilk bir tanesi (w/full scan, sanırım). – vorou