2017-02-19 8 views
0

Я writitng статьи, ее содержание и ключевых слов в базу данных MongoDB с помощью Python..now пользователя может дать мне ключевое слово, мне нужно, чтобы найти статьи, содержащие эти ключевые слова ..PyMongo и элементы в БД

Я wrting к БД, как показано ниже:

myrecord = {"Link": link, 
      "Title": title, 
      "HeadLine": headline, 
      "BodyText":innerBodyText, 
      "Keywords":keywords, 
      "date": datetime.datetime.utcnow() 
      } 
      try: 
       print("Inserting the record in the DB") 
       result = my_collection.insert_one(myrecord, False) 

ключевых слов является список bnary кортежа

[("africa",3),("content",5),...] 

Я хотел бы знать, мотыга для осуществления выше usecases..I для travese нужду всех записей в БД, чтобы найти статьи га ving определенное ключевое слово

Подпись ниже uery для этого?

def getArticlesbyKeywords(self,keyword,showBody=False): 
    client = pymongo.MongoClient(
     "mongodb://mahdi:[email protected]:15312,aws-ap-southeast-1-portal.0.dblayer.com:15312/BBCArticles?ssl=true", 
     ssl_cert_reqs=ssl.CERT_NONE) 

    mydb = client['BBCArticles'] 
    my_collection = mydb['Articles'] 
    my_collection.create_index([("Keywords.key", "text")]) 
    print 'Articles containing higher occurences of the keyword is sorted as follow:' 
    for doc in my_collection.find({"$text": {"$search": keyword}}).sort({"score": {"$meta": "textScore"}}): 
     print(doc)) 

Я получаю ниже ошибки:

Traceback (most recent call last): 
    File "api_access.py", line 21, in <module> 
    api.getArticlesbyKeywords("BBC") 
    File "api_access.py", line 15, in getArticlesbyKeywords 
    for doc in my_collection.find({"$text": {"$search": keyword}}).sort({"score": {"$meta": "textScore"}}): 
    File "C:\Python27\lib\site-packages\pymongo\cursor.py", line 660, in sort 
    keys = helpers._index_list(key_or_list, direction) 
    File "C:\Python27\lib\site-packages\pymongo\helpers.py", line 63, in _index_list 
    raise TypeError("if no direction is specified, " 
TypeError: if no direction is specified, key_or_list must be an instance of list 

запись образец в моей Монго DB выглядит следующим образом:

Keywords: "[{'count': 20, 'key': 'north'}, {'count': 13, 'key': 'image'}, {'count': 13, 'key': 'korean'}, {'count': 10, 'key': 'malaysian'}, {'count': 9, 'key': 'kim'}]" 

ответ

1

Вам нужно немного другую схему для того, чтобы сделать эту запрашиваемых данных , Вставьте массив документов, а не массив пар:

my_collection.insert_one({ 
    "Keywords": [{"key": "africa", "score": 3}, 
       {"key": "content", "score": 5}] 
}) 

Тогда вы можете запросить как:

for doc in my_collection.find({"Keywords.key": "africa"}): 
    print(doc) 

Убедитесь, что вы создаете индекс:

my_collection.create_index([("Keywords.key", 1)]) 

Если вы хотите больше сложный запрос, используйте индекс текста:

my_collection.create_index([("Keywords.key", "text")]) 
for doc in my_collection.find(
    {"$text": {"$search": "africa"}} 
).sort({"score": {"$meta": "textScore"}}): 
    print(doc) 

См. MongoDB Text Indexes и sort by meta.

+0

Привет, спасибо за ваш ответ. Могу ли я его сортировать по более высоким баллам, когда я получу свой результат? – Mehdi

+0

Да, сортировать по "$ meta": "textScore". Я обновил свой ответ. –

+0

Привет, я получаю исключение, когда я использую ваш код, я отредактировал мой вопрос выше. – Mehdi

0

использовать $ elemMatch для поиска в массиве.

db.test1.find({"items":{"$elemMatch" : {"$elemMatch": {"$in": ["a"]}}}}) 
{ "_id" : ObjectId("58a9a9805cfd72c8efd8f315"), "name" : "a", "items" : [ [ "a", 1 ], [ "b", 2 ] ] } 

Почему бы не использовать поддокумент как

ключевым словам: [{ квт: "Африка", Количество: 3 }, ...]

, то вы можете использовать гнездо. например {"keywords.kw": "africa"} для поиска.