您的位置:首页 > 数据库 > Mongodb

MongoDB C# r 中IMongoQuery的内部实现Query的用法

2015-08-26 14:19 761 查看
本文地址:/article/5753172.html
http://chqa.blog.163.com/blog/static/274633320150100721416/
1.C#下对MongoDB中的数据分组Group

IMongoQuery query = null;
query = Query.And(
Query.EQ("CityCode", "hangzhou"),
Query.EQ("LT_IsBDT", 1),
Query.EQ("LT_Checked", 1)
);

Dictionary<string, int> dictionary = new Dictionary<string, int>();
dictionary["num"] = 0;

//IMongoGroupBy groupBy = null;
//groupBy = GroupBy.Keys("LTT_ID");
GroupByBuilder groupByBuilder = new GroupByBuilder(new string[] { "LTT_ID", "LTT_TypeName", "LTT_ParentID" });

var tSmall = _mongoCollection.Group(query, groupByBuilder, BsonDocument.Create(dictionary),
BsonJavaScript.Create("function(doc,prev){prev.num++;}"),
BsonJavaScript.Create("function(doc){ doc.count=doc.num;delete doc.num; }")).ToList();


2.C#操作MongoDB的部分代码示例

MongoServer _mongoServer = MongoServer.Create("mongodb://192.168.90.245:10008/?safe=true"); //连接数据库
MongoDatabase _mongoDatabase = _mongoServer.GetDatabase("MYDB"); //选择数据库名
MongoCollection MongoCt = _mongoDatabase.GetCollection("MyCollection"); //选择集合,相当于表

//获取数据
public List<InfoModel> GetTopicListByType(string sKeyWord,int iPageSize,int iCurrPageIndex)
{
IMongoQuery query = null;
query = Query.And(
Query.EQ("LT_IsBDT", 1),
Query.EQ("LT_Checked", 1),
Query.Or(Query.EQ("LT_Status", 0), Query.EQ("LT_Status", 1)),
Query.GTE("LT_CreateDate", DateTime.Now),
Query.Matches("LT_Title", BsonRegularExpression.Create("/.*" + sKeyWord + ".*/"))
);
SortByDocument sort = new SortByDocument { { "LT_CreateDate", -1 } };
return MongoCt.FindAs<InfoModel>(query).SetLimit(iPageSize).SetSkip(iPageSize * iCurrPageIndex).SetSortOrder(sort).ToList();
}

//更新+1
public bool IncViewCount(int iLtId, int iInc)
{
IMongoQuery query;
query = Query.And(
Query.EQ("LT_ID", iLtId)
);

UpdateBuilder update = new UpdateBuilder();
SafeModeResult r = MongoCt.Update(query, update.Inc("LT_ViewCount", iInc));
return r != null && r.Ok;
}

//插入数据
public bool InsertBatch<T>(IEnumerable<T> document)
{
List<SafeModeResult> result = (List<SafeModeResult>) this.MongoCt.InsertBatch<T>(document);
return result != null && result[0] != null && result[0].Ok;
}

//根据ID删除数据
public bool RemoveBatchById(List<int> list)
{
IMongoQuery query = null;
query = Query.And(
Query.In("IA_ID",BsonArray.Create(list))
);
SafeModeResult result = this.MongoCt.Remove(query);

return result != null && result.Ok;
}

//根据ID更新数据
public bool UpdateSingleByLtid(InfoModel model)
{
IMongoQuery query;
query = Query.And(
Query.EQ("IA_ID", model.IA_ID)
);
BsonDocument bsonDocument = model.ToBsonDocument<InfoModel>();
bsonDocument.Remove("_id");
bsonDocument.Remove("IA_ID");

var update = new UpdateDocument
{
{"$set", bsonDocument}
};
SafeModeResult result = this.MongoCt.Update(query, update);
return result != null && result.Ok;
}

// 删除所有数据
public bool RemoveAll()
{
SafeModeResult r = this.MongoCt.Remove(null);
return r != null && r.Ok;
}

// 创建索引
public bool CreateIndex1()
{
SafeModeResult r = this.MongoCt.CreateIndex(
new IndexKeysBuilder().Ascending("IA_CityCode","IT_Key").Descending("IA_CreateDate")
);
return r != null && r.Ok;
}

// 获取表索引
public GetIndexesResult GetIndex()
{
return this.MongoCt.GetIndexes();
}

// 删除表索引
public bool DropIndex()
{
return this.MongoCt.DropAllIndexes().Ok;
}


3.命令行下语法

db.collection.update( criteria, objNew, upsert, multi )

criteria : update的查询条件,类似sql update查询内where后面的
objNew   : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
upsert   : 这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi    : mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。

//用法:{ $inc : { field : value } }
//意思对一个数字字段field增加value, 如SQL-“update test0 set count=count+1 where _id=15”
db.test0.update( { "_id" : 15 } , { $inc : { "count" : 1 } } );

//用法:{ $unset : { field : 1} }
//顾名思义,就是删除字段了,删除某条件下的文档中的某个列,如:
db.test0.update( { "_id" : 15 } , { $unset : { "Age":1 } } );

//添加字段赋值
db.test0.find().forEach(
function(item){
db.test0.update({},{"$set":{"CreateDate":item.UpdateDate}},false,true)
}
)

db.test0.find({CityCode:"hz","CreateDate":{$exists:false}}).forEach(
function(item){
db.test0.update({CityCode:"hz","CreateDate":{$exists:false}},{"$set":{"CreateDate":item.UpdateDate}},false,true)
}
)

//查询指定字段
db.test0.find({},{"CreateDate":1,_id:0})

//查找不存在字段FName的记录
db.test0.find({CityCode:"hz","FName":{$exists:false}})

//创建索引
db.test0.ensureIndex({"CityCode":1,"LT_ID":-1},{"name":"test0ByLtId"})
//删除索引
db.runCommand({deleteIndexes: "表名", index: "索引名"})   //删除指定索引
db.test0.dropIndexes()    //删除所有索引
//查看索引
db.test0.getIndexes()

//列重命名
db.test0.update({},{$rename:{"BigTypeName":"ParentTypeName"}},false,true)

db.test0.remove({});    // 删除things中的所有数据
db.test0.remove({n:1}); // 删除things中n=1的所有数据 类似delete where n = 1

// 链接字符串
Servers=IP:27017;ConnectTimeout=30000;ConnectionLifetime=300000;MinimumPoolSize=8;MaximumPoolSize=256;Pooled=true


Query.All("name", "a", "b");//通过多个元素来匹配数组
Query.And(Query.EQ("name", "a"), Query.EQ("title", "t"));//同时满足多个条件
Query.EQ("name", "a");//等于
Query.Exists("type", true);//判断键值是否存在
Query.GT("value", 2);//大于>
Query.GTE("value", 3);//大于等于>=
Query.In("name", "a", "b");//包括指定的所有值,可以指定不同类型的条件和值
Query.LT("value", 9);//小于<
Query.LTE("value", 8);//小于等于<=
Query.Mod("value", 3, 1);//将查询值除以第一个给定值,若余数等于第二个给定值则返回该结果
Query.NE("name", "c");//不等于
Query.Nor(Array);//不包括数组中的值
Query.Not("name");//元素条件语句
Query.NotIn("name", "a", 2);//返回与数组中所有条件都不匹配的文档
Query.Or(Query.EQ("name", "a"), Query.EQ("title", "t"));//满足其中一个条件
Query.Size("name", 2);//给定键的长度
Query.Type("_id", BsonType.ObjectId );//给定键的类型
Query.Where(BsonJavaScript);//执行JavaScript
Query.Matches("Title",str);//模糊查询 相当于sql中like  -- str可包含正则表达式


collection.Find(query).SetSortOrder(new SortByDocument("name1", 1) ).SetLimit(2);

collection.FindAll().Size

int count= collection.Count(query);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: