我必须在.net mvc中搜索mongodb特定集合中的所有文档中的内容。我已经通过像这里成功创建索引一样尝试了mongodb shell。
db.collection_name.createIndex( { subject: "text" } )
db.collection_name.find( { $text: { $search: "search_word" } } )
工作正常。但是,当我把它放在.net中,这给了我错误。我用Google搜索并获得了以下索引解决方案。
collection.EnsureIndex(new IndexKeysBuilder().Ascending("subject"));
现在我如何运行此查询db.collection_name.find( { $text: { $search: "coffee" } } )
。
我正在尝试使用.net。
collection.CreateIndex("subject":"text");
var query = collection.Find({ $text: { $search: "coffe" }});
但我在第一行收到错误"将文本表示为unicode系列....语法错误"
第二行错误"没有给出符合所需形式参数的参数"和"意外的角色$"。
任何建议将不胜感激。
答案 0 :(得分:6)
我可以使用此命令创建文本索引:
collection.Find(Builders<searchFileByAuthor>.Filter.Text("coffe")).ToList();
而且我可以这样查询索引:
searchFileByAuthor
public class searchFileByAuthor
{
public int Id { get; set; }
public string subject { get; set; }
}
只是我的假类,有主题字段:
import groovy.io.FileType
import groovy.sql.Sql
import oracle.jdbc.OracleDriver
import java.sql.Date
final def PROJECT_DIR = "/appdata/project/pmp"
final def SCRIPT_DIR = "/scm/src/main/scripts"
// To be able to use driver...
new OracleDriver();
sql = Sql.newInstance("jdbc:oracle:thin:@localhost:1521:XE", "PMP", "pmp")
sql.execute("delete from SCM_GROOVY_SCRIPTS")
def dir = new File(PROJECT_DIR + SCRIPT_DIR);
dir.eachFileRecurse(FileType.FILES) { file ->
String scriptName = file.name.substring(0, file.name.indexOf('.'))
def timestamp = new Date(System.currentTimeMillis())
println scriptName
println timestamp
List<Object> params = new ArrayList<>()
params.add(scriptName)
params.add(file.bytes)
params.add(timestamp)
sql.execute("INSERT INTO SCM_GROOVY_SCRIPTS (SCRIPT_NAME, SCRIPT_SOURCE, LAST_UPDATED) VALUES (?, ?, ?)", params)
}
sql.close()
答案 1 :(得分:3)
Maksim Simkin的答案是正确的,尽管它已经过时了。 更新的版本将是:
collection.Indexes.CreateOne(new CreateIndexModel<YourClass>(Builders<YourClass>.IndexKeys.Text(x => x.something)));
或者,如果您想使用通配符索引(为整个文档建立索引),则可以这样做:
collection.Indexes.CreateOne(new CreateIndexModel<YourClass>(Builders<YourClass>.IndexKeys.Text("$**")));
或者出于某种原因,您可能想要/拥有更多索引,而不是这样做:
var indexWildcardTextSearch = new CreateIndexModel<YourClass>(Builders<YourClass>.IndexKeys.Text("$**"));
List<CreateIndexModel<YourClass>> indexes = new List<CreateIndexModel<YourClass>>();
indexes.Add(indexWildcardTextSearch);
collection.Indexes.CreateMany(indexes);
要查询,它保持不变:
collection.Find(Builders<YourClass>.Filter.Text("something")).ToList();
答案 2 :(得分:0)
public List<T> FindSearch<T>(string collectionName, string searchWord) {
IMongoQuery query = Query.Text(searchWord);
List<T> find = getCollection<T>(collectionName).Find(query).ToList();
return find;
}