Вы можете использовать оператор $ или $ all, чтобы сделать то, что, я считаю, вы хотите достичь.
С учетом вашего примера документа:
> db.test.find().pretty()
{
"_id" : ObjectId("4f26b716c27b085280a45a29"),
"name" : "Apollo",
"text" : "Some text about Apollo moon landings",
"keywords" : [
"some",
"text",
"about",
"apollo",
"moon",
"landings"
]
}
Вы можете использовать оператор $ и для поиска документа, в массиве ключевых слов которого содержатся оба слова.
> db.test.find({$and:[{keywords:"apollo"}, {keywords:"landings"}]})
{ "_id" : ObjectId("4f26b716c27b085280a45a29"), "name" : "Apollo", "text" : "Some text about Apollo moon landings", "keywords" : [ "some", "text", "about", "apollo", "moon", "landings" ] }
>
Оператор $ all вернет тот же результат, и запрос будет немного более упорядоченным:
> db.test.find({keywords:{$all:["apollo", "landings"]}})
{ "_id" : ObjectId("4f26b716c27b085280a45a29"), "name" : "Apollo", "text" : "Some text about Apollo moon landings", "keywords" : [ "some", "text", "about", "apollo", "moon", "landings" ] }
Если мы поместим индекс в массив ключевых слов, оба запроса сделаютиспользовать это.
> db.test.ensureIndex({keywords:1})
> db.test.find({$and:[{keywords:"apollo"}, {keywords:"landings"}]}).explain()
{
"cursor" : "BtreeCursor keywords_1",
"nscanned" : 1,
"nscannedObjects" : 1,
"n" : 1,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : true,
"indexOnly" : false,
"indexBounds" : {
"keywords" : [
[
"apollo",
"apollo"
]
]
}
}
> db.test.find({keywords:{$all:["apollo", "landings"]}}).explain()
{
"cursor" : "BtreeCursor keywords_1",
"nscanned" : 1,
"nscannedObjects" : 1,
"n" : 1,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : true,
"indexOnly" : false,
"indexBounds" : {
"keywords" : [
[
"apollo",
"apollo"
]
]
}
}
>
В обоих запросах используется индекс ключевых слов.
Для получения дополнительной информации о различных типах запросов, пожалуйста, обратитесь к документу «Расширенные запросы».
http://www.mongodb.org/display/DOCS/Advanced+Queries
Для получения дополнительной информации о том, как работает индексация в Mongo, см.к документу «Индексация».
http://www.mongodb.org/display/DOCS/Indexes#Indexes-IndexingArrayElements
Раздел «Элементы индексации массива» содержит ссылку на документацию по MultiKeys.http://www.mongodb.org/display/DOCS/Multikeys
Если вы не знакомы с функцией .explain в mongodb, это объясняется здесь: http://www.mongodb.org/display/DOCS/Explain В двух словах, он отображает все индексы, которые использует ваш запрос, и количество документов.необходимо получить доступ, чтобы вернуть соответствующие.
Наконец, ваш вопрос похож на вопрос другого пользователя, который спрашивал о поиске значений в массивах ранее этим утром.Возможно, это будет иметь отношение и к вам.
http://groups.google.com/group/mongodb-user/browse_thread/thread/38f30a56094d9e3e
Надеюсь, это поможет вам написать запрос, который вы ищете.Пожалуйста, дайте нам знать, если у вас есть дополнительные вопросы!