2016-03-28 9 views
1

mongodb kullanarak twitter klon oluşturuyorum ve içinde belirli hashtag var tweets aramak istiyorum. Benim veritabanı için belge yapısını aşağıdaki ile geldi -Her alt belgede dizinin belirli bir anahtar sözcük içerdiği bir dizide alt belgeleri nasıl bulacağınız nasıl bulunur?

{ 
    "_id" : ObjectId("56f88c038c297eb4048e5dff"), 
    "twitterHandle" : "abhayp", 
    "firstName" : "Abhay", 
    "lastName" : "Pendawale", 
    "emailID" : "[email protected]", 
    "password" : "278a2c36eeebde495853b14e6e5525fd12074229", 
    "phoneNumber" : "12394872398", 
    "location" : "San Jose", 
    "birthYear" : 1992, 
    "birthMonth" : 0, 
    "birthDay" : 1, 
    "followers" : [ 
     "abhayp", 
     "deepakp", 
     "john", 
     "madhuras", 
     "nupurs", 
     "vgalgali" 
], 
"following" : [ 
    "abhayp", 
    "abhinavk", 
    "ankitac", 
    "anupd", 
    "arpits"   
], 
"tweets" : [ 
    { 
     "tweet_id" : "3f0fe01f8231356f784d07111efdf9d8ead28133", 
     "tweet_text" : "This new twitter sounds good!", 
     "created_on" : ISODate("2016-03-13T01:47:37Z"), 
     "firstName" : "Abhay", 
     "lastName" : "Pendawale", 
     "twitterHandle" : "abhayp", 
     "tags" : [ ] 
    }, 
    { 
     "tweet_id" : "4e57b6d7d6b47d69054f0be55c238e8038751d84", 
     "tweet_text" : "#CMPE273 Node.js is #awesome", 
     "created_on" : ISODate("2016-03-07T23:16:39Z"), 
     "firstName" : "Abhay", 
     "lastName" : "Pendawale", 
     "twitterHandle" : "abhayp", 
     "tags" : [ 
      "awesome", 
      "CMPE273" 
     ] 
    }, 
    { 
     "tweet_id" : "e5facd5f37c44313d5be02ffe0a3ca7190affd6b", 
     "tweet_text" : "Getting an incredible welcome in #Pune #travel #adventure #film #india ", 
     "created_on" : ISODate("2016-03-07T23:37:27Z"), 
     "firstName" : "Abhay", 
     "lastName" : "Pendawale", 
     "twitterHandle" : "abhayp", 
     "tags" : [ 
      "adventure", 
      "film", 
      "india", 
      "Pune", 
      "travel" 
     ] 
    }, 
    { 
     "tweet_id" : "f5a735c1f747732f3e04f6cb2c092ff44750c0fd", 
     "tweet_text" : "The D Day today!\n#TheDDay", 
     "created_on" : ISODate("2016-03-18T22:24:57Z"), 
     "firstName" : "Abhay", 
     "lastName" : "Pendawale", 
     "twitterHandle" : "abhayp", 
     "tags" : [ ] 
    } 
]} 

ben tweet tags dizisinde "Pune" sahip tweet öğrenmek istiyorum. db.users.find({ "tweets.tags" : {$all: ["Pune"] }}, { tweets : 1 }).pretty();

komutunu izlemeye çalıştım ancak bu komut tweet'lerinden birinin etiketlerinde 'Pune' girdisi olan kullanıcıların TÜM tweet'lerini döndürür. Sadece tags dizisinde 'Pune' girişine sahip olan tweet'leri nasıl arayabilirim?

Not: #Pune yapan kullanıcıları istemiyorum, #Pune içeren tüm tweet'leri istiyorum. Yinelenen işaretli soru, bu sorunu çözmez. sorguda aşağıdaki

Koşu - sonuçlarını izleyen

db.users.aggregate([{ 
    $match: { 
     'tweets.tags': 'Pune' 
    } 
}, { 
    $project: { 
     tweets: { 
      $filter: { 
       input: '$tweets', 
       as: 'tweet', 
       cond: { 
        $eq: ['$$tweet.tags', 'Pune'] 
       } 
      } 
     } 
    } 
}]); 

döner -

{ "_id" : ObjectId("56f88c038c297eb4048e5df1"), "tweets" : [ ] } 
{ "_id" : ObjectId("56f88c038c297eb4048e5dff"), "tweets" : [ ] } 
{ "_id" : ObjectId("56f88c038c297eb4048e5e07"), "tweets" : [ ] } 

ne istiyorum kesinlikle olmaz! :(

+0

Merhaba, yinelenen soru orijinal sorumu çözmüyor, bu soruyu çözmeme yardımcı olabilir misiniz? – pratiksanglikar

cevap

0

Ben projection operator yakındır. Bazı dolambaçlı toplama aşamalarını kullanarak yanında, mümkün

sanmıyorum ama sadece ilk maç döndürür.

Benim tavsiyem bir de tweet koymak olurdu Ayrı koleksiyonlar, onları taramak için çok daha uygun ve muhtemelen daha fazla ölçeklenebilir.Örneğin ilgili kullanıcı bilgilerini çoğaltıyorsunuz, bu yüzden içeriğinizi değiştirmek zorunda değilsiniz.

İlgili konular