2014-11-08 16 views
14

MongoDB'den mongoose kullanarak veri almakta sorun yaşıyorum. İşte Mongoose find kullanarak bir dizenin bir bölümünü içeren tüm değerler nasıl alınır?

benim Şema geçerli:

const BookSchema = new Schema(
 
\t { 
 
\t \t _id:Number, 
 
\t \t title:String, 
 
\t \t authors:[String], 
 
\t \t subjects:[String] \t 
 
\t } 
 
);

i nesne gömülü 2 diziler var gördüğünüz gibi, en yazarların içeriği böyle bir şey olabilir varsayalım: Yazarlar: ["Alex Ferguson", "Didier Drogba", "Cristiano Ronaldo", "Alex"]
elde etmeye çalıştığım şey dizideki bütün Alex'leri elde etmektir.

Şimdiye kadar, değerleri tamamen eşleştiriyorlarsa değerleri elde edebildim. Ancak Alex'i içerenleri almaya çalışırsam cevap her zaman [].

Bilmek istediğim, bir görünüm veya koleksiyon oluşturmak için bir map-reduction gerçekleştirmeden find() öğesini kullanarak bunu nasıl yapabileceğimi ve ardından find() öğesini bu uygulamayla nasıl uygulayabileceğimi bilmektir. {yazarları kesin Bazı şeyleri ama hiçbir şans {: {$ elemMatch req.query.q} yazarları} çalıştı

Book.find({authors:req.query.q} , function(errs, books){ 
 
\t \t \t if(errs){ 
 
\t \t \t \t res.send(errs); \t 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t res.json(books); 
 
\t \t });

maçları için

kod burada çalışır: {$ in: [req.query.q]}}

Bu, bana bir hata veriyor ve bunun üzerine, burada bulduğum başka bir gönderide çok verimsiz olduğunu söylüyor. {$ burada:! This.authors.indexOf (req.query.q) = -1}

ve ben de {yazarlar: {$ regex: "./ değeri/i"}} çalıştı

Harita azaltımı iyi çalışıyor, hangisinin daha iyi olduğunu görmek için diğer yaklaşımı kullanarak çalışmam gerekiyor mu?

Her türlü yardım büyük beğeni topluyor. Eminim bu kolay, ama NodeJS ve Mongo'yla yeniyim ve bunu kendi başıma çözemedim.

cevap

48

Bunu neredeyse kendiniz etiketlerinizde yanıtladı. MongoDB, normal ifadenin sorgu olarak gönderilmesini sağlayan $regex operatörüne sahiptir.

Books.find(
    { "authors": { "$regex": "Alex", "$options": "i" } }, 
    function(err,docs) { 
    } 
); 

Ayrıca yapabilirsiniz: Yani "Alex" Bunu içeren dizeleri sorgulamak

Books.find(
    { "authors": /Alex/i }, 
    function(err,docs) { 

    } 
); 

İkisi de gösterildiği gibi doğru desteklenen sözdizimi yargılanması nasıl geçerli ve farklı Dökümantasyon.

Ama tabiki "diziyi nasıl elde edeceğimizi" soruyorsanız, "dizgede bir yerlerde 'Alex' ile eşleşenler için sadece sonuç nedir?" o zaman bu biraz farklı. Birden fazla bir dizi öğesi için

Kompleks eşleştirme aggregation framework alanıdır (ya da muhtemelen mapreduce, ama bu çok daha yavaştır) Eğer "filtre" dizi içeriği gereken yere.

Aynı şeyden başlıyorsunuz. Buradaki anahtar, tek tek dokümanlar olarak uygun şekilde "filtrelemek" için değişken olması amacıyla dizi içeriğini "normalleştirmemek" için $unwind sayılı belgedir. Ardından diziyi "eşleşen" belgelerle yeniden oluşturun.

Books.aggregate(
    [ 
     // Match first to reduce documents to those where the array contains the match 
     { "$match": { 
      "authors": { "$regex": "Alex", "$options": i } 
     }}, 

     // Unwind to "de-normalize" the document per array element 
     { "$unwind": "$authors" }, 

     // Now filter those document for the elements that match 
     { "$match": { 
      "authors": { "$regex": "Alex", "$options": i } 
     }}, 

     // Group back as an array with only the matching elements 
     { "$group": { 
      "_id": "$_id", 
      "title": { "$first": "$title" }, 
      "authors": { "$push": "$authors" }, 
      "subjects": { "$first": "$subjects" } 
     }} 
    ], 
    function(err,results) { 

    } 
) 
+0

teşekkürler Neil, haklıydınız. Çalıştığınız başlangıçta gönderdiğiniz iki kod parçasından birini kullanın. – Dyan

İlgili konular