对于mongoDB 客户mongoVal对经常需要些json格式来进行查询。
简单介绍几种常见的查询
(1)or查询:
在JSON中"$or"表示后面的数组里面的元素是存在or关系,而不是表示和前面元素存在or的关系。
{"$or":[{"encodeId":444},{"encodeId":446},{"encodeId":447}]}
这就表示把encodeId=444,446,447的元素查询出来
(2)and查询
and 和or相反也是表示后面的数组里面的元素是存在and关系,而不是表示和前面元素存在and的关系。
默认不知明表示是and关系。
{"$and":[{"encodeId":444},{"encodeId":446},{"encodeId":447}]}
{"status":30,"encodeId":{"$lte":500}}
(3)大于("$gt")
{"encodeId":{"$gt":500}}
(4)小于(“$lt”)
{"encodeId":{"$lt":500}}
(5)大于等于(“$gte”)
{"encodeId":{"$gte":500}}
(6)小于等于(“$lte”)
{"encodeId":{"$lte":500}}
(7) 有的时候需要大于个数小一个数
{"encodeId":{"$lte":500,"$gt":480}}
(8)where 查询
{"$where":"this.completeTime>0&&this.completeTime<=this.updateTime"}
(9)模糊查询
{fileName:{"$regex":"wmv|mp4"}}
(10) 不等于("$ne")
(11)in操作
{ "uploadId" : { "$in" : [ "135305" , 231405" , "231419" , "228812"]}}
案例查询语句
{"$or": [
{
"videoCDNStatus": {
"$gt": -3,
"$lte": 0
},
"mmsStatus": 0,
"status": 30
},
{
"videoCDNStatus": 1,
"status": 30
},
{
"videoCDNStatus": 10,
"$or": [
{
"checksumStatus": 0
},
{
"checksumStatus": 1
}
],
"status": 30
},
{
"videoCDNStatus": 10,
"checksumStatus": 2,
"status": 30
},
{
"videoCDNStatus": 10,
"checksumStatus": 10,
"status": 30,
"mmsStatus": 0
}
]
}
在java中通过morphia 中query操作语句
query.or(
query.and(query.criteria("videoCDNStatus").lessThanOrEq(0),query.criteria("videoCDNStatus").greaterThan(-3),query.criteria("mmsStatus").equal(0),query.criteria("status").equal(VideoEncode.STATUS_COMPLETE)),
query.and(query.criteria("videoCDNStatus").equal(VideoEncode.CDN_STAUTS_ING),query.criteria("status").equal(VideoEncode.STATUS_COMPLETE)),
query.and(query.criteria("videoCDNStatus").equal(VideoEncode.CDN_STAUTS_COMPLETE),query.or(query.criteria("checksumStatus").equal(0), query.criteria("checksumStatus").equal(1)),query.criteria("status").equal(VideoEncode.STATUS_COMPLETE)),
query.and(query.criteria("videoCDNStatus").equal(VideoEncode.CDN_STAUTS_COMPLETE),query.criteria("checksumStatus").equal(2),query.criteria("status").equal(VideoEncode.STATUS_COMPLETE)),
query.and(query.criteria("videoCDNStatus").equal(VideoEncode.CDN_STAUTS_COMPLETE),query.criteria("checksumStatus").equal(VideoEncode.CHECKSUM_STAUTS_COMPLETE),query.criteria("status").equal(VideoEncode.STATUS_COMPLETE),query.criteria("mmsStatus").equal(0))
);
Query<VideoEncode> query = createQuery();
query.field("mid").equal(mid);
query.or(
query.and(query.criteria("status").equal(VideoEncode.STATUS_COMPLETE).criteria("videoCDNStatus").equal(VideoEncode.CDN_STAUTS_COMPLETE).criteria("checksumStatus").equal(VideoEncode.CDN_STAUTS_COMPLETE)),
query.or(query.criteria("status").equal(VideoEncode.STATUS_FAIL),query.criteria("videoCDNStatus").equal(VideoEncode.CDN_STAUTS_FAIL),query.criteria("checksumStatus").equal(VideoEncode.CHECKSUM_STAUTS_FAIL))
);
return find(query).asList();
插入一个带有数组元素的文档
> db.food.insert({"fruit": ["apple", "banana", "peach"]})
> db.food.find()
{ "_id" : ObjectId("4ea6a4ef0b12b1d429b4057f"), "fruit" : [ "apple", "banana", "peach" ] }
查询数组元素中包含某个值的文档
> db.food.find({"fruit": "banana"})
{ "_id" : ObjectId("4ea6a4ef0b12b1d429b4057f"), "fruit" : [ "apple", "banana", "peach" ] }
> db.food.find({"fruit": {"$all": ["banana"]}})
{ "_id" : ObjectId("4ea6a4ef0b12b1d429b4057f"), "fruit" : [ "apple", "banana", "peach" ] }