2015-12-30 24 views
6

Bu iki koleksiyon varsa:Bir belgeyi mongoDB'de referanslarını gösteren bir dizine eklemenin bir yolu var mı?

Book: { 
title: String, 
description: String 
author: {type: mongoose.Schema.Types.ObjectId, ref: 'User'}, 
} 

User: { 
_id: (generated by mongo) 
username: String 
} 

Ve FTS için dizin Kitabı istiyoruz. Kullanıcı adları, açık bir şekilde kitap koleksiyonunda saklanmasa bile, kullanıcı adıyla da aranabilir bir şekilde yapabilir miyim? Başka bir deyişle, nüfuslu bir koleksiyonun indekslenmesi mümkün mü (veya tavsiye edilir)? Blakes Yedi belirtildiği gibi

Teşekkür

+0

adlandırıyoruz: http://stackoverflow.com/questions/13026486/how-to-populate-a-sub-document-in-mongoose-after-creating-it http: // mongoosejs. com/docs/api.html # model_Model.populate –

+0

Yani dizin ekleyerek: true, referans koleksiyon içinde endekslenecek mi? –

+4

Hayır. Başka bir koleksiyondan "kullanıcı adı" (veya başka bir alan) üzerinde bulunan herhangi bir bilgiyi (FTS veya başka türlü) yapmak mümkün değildir. Bu MongoDB'nin yapmadığı ("$ lookup' kümelenmesi hariç") ​​bir "join", ve "populate", gerçekten bir birleştirme değil, ayrı bir arama sorgusu çalıştırmanın etrafındaki bir kolaylıktır. Veritabanından yalnızca bir kerede yalnızca bir koleksiyondan veri araması yapmasını isteyebilirsiniz. –

cevap

1

, bu koleksiyonlarda en endeksi mümkün değildir.

Bu tür bir tam metin aramasının benim başvurum için her şeyden önemli olduğu durumlarda, klasik çözüm, alanı denormalize etmek ve her iki koleksiyona da eklemektir. author.username üzerinde

Book: { 
    title: String, 
    description: String 
    author: { 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'User', 
    ### New field ### 
    username: String 
    }, 
} 

Artık yapabilirsiniz endeksi: Bu durumda, sizin Book toplama gibi görünecektir.

İyi bir fikir olup olmamasına bakılmaksızın uygulamanıza tamamen bağımlıdır. Downsides, koleksiyonlar arasında username senkronizasyonunu ve her bir belgeye gereksiz ağırlık eklemeyi içerir.

İlgili konular