您可以使用 $and 或 $all 运算符来完成我认为您希望完成的事情。
鉴于您的示例文档:
> db.test.find().pretty()
{
"_id" : ObjectId("4f26b716c27b085280a45a29"),
"name" : "Apollo",
"text" : "Some text about Apollo moon landings",
"keywords" : [
"some",
"text",
"about",
"apollo",
"moon",
"landings"
]
}
您可以使用 $and 运算符搜索“关键字”数组包含两个单词的文档。
> 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
如果你对mongodb的.explain函数不熟悉,这里解释一下:
http://www.mongodb.org/display/DOCS/Explain
简而言之,它显示您的查询正在使用的所有索引,以及需要访问多少文档才能返回相关文档。
最后,您的问题似乎与今天早上早些时候询问在数组中搜索值的另一位用户的问题相似。也许这也与您有关。
http://groups.google.com/group/mongodb-user/browse_thread/thread/38f30a56094d9e3e
希望这将帮助您编写您正在寻找的查询。如果您有任何后续问题,请告诉我们!