1. 程式人生 > >Mongodb Java count 用法記錄(巢狀欄位也是可以的)

Mongodb Java count 用法記錄(巢狀欄位也是可以的)

當你需要確定某個欄位等於“xxxxx”的記錄在mongodb裡面到底有多少條的時候,就可以使用這個count。
我這使用的是 spring-data-mongodb-1.5.0 來訪問資料庫的。

本以為這個只是支援簡單的某個欄位 A="xxx" 這種簡單的count查詢,後來實際測試下發現,針對巢狀的欄位,也是可以的。

首先這地方得有個複雜的,帶有巢狀欄位的一個model。

先看下簡單的json資料

{
  "_id" : ObjectId("597f0661e4b0b36fc16aebb4"),
  "title" : "大神lxk",
  "baselinesetting" : {
    "customMetricCalculations" : [{
        "alarmHandleSetting" : {
          "times" : 0,
          "calendarId" : "32RJePzB"
        }
      }]
  },
  "alarmsettings" : [{
      "alarmHandleSetting" : {
        "times" : 0,
        "calendarId" : "32RJePzB"
      }
    }, {
      "alarmHandleSetting" : {
        "times" : 0,
        "calendarId" : "EVIWBAeR"
      }
    }]
}
然後就是簡單的Java model啦
@Document(collection = "streams")
public class Stream implements Serializable, Cloneable {
	xxxxx//省略了很多多餘的屬性和getter和setter方法
	@Id
    private String id;
    private BaselineSetting baselinesetting;
    private List<Alarmsetting> alarmsettings;
}
@Data
public class Alarmsetting implements Serializable {
	xxxxx//省略了很多多餘的屬性和getter和setter方法
    private AlarmHandleSetting alarmHandleSetting;
}
@Data
public class AlarmHandleSetting {
	xxxxx//省略了很多多餘的屬性和getter和setter方法
    private int times;
    private String calendarId;
}
@ResourceName("default_setting")
public class BaselineSetting implements Serializable {
	xxxxx//省略了很多多餘的屬性和getter和setter方法
    private List<CustomMetricCalculation> customMetricCalculations;
}
@Data
public class CustomMetricCalculation implements Comparable<CustomMetricCalculation> {
	xxxxx//省略了很多多餘的屬性和getter和setter方法
    private AlarmHandleSetting alarmHandleSetting;
}

然後就是看看,怎麼在這個mongodb視覺化資料庫訪問工具裡面使用這個count方法



可以看到,這個工具確實可以這麼直接count。

下面看Java 程式碼怎麼實現這個功能。

//這地方是實現了2個介面,一個是框架帶的,一個是自定義的
@Repository("streamRepository")
public interface StreamRepository extends MongoRepository<Stream, String>, StreamRepositoryCustom {
	xxxx
	//類似這種的很多的自定義查詢方法
	@Query("{'id':?0}")
    Stream findById(String id);
}

//自定義介面
public interface StreamRepositoryCustom {
	long count(String calendarSId);
}

//實現自定義介面的方法
public class StreamRepositoryImpl implements StreamRepositoryCustom {
	@Autowired
    private MongoTemplate mongoTemplate;
	Query query = Query.query(Criteria.where("alarmsettings.alarmHandleSetting.calendarId").is(calendarSId));
	return mongoTemplate.count(query, Stream.class);
}

//service中呼叫dao方法。
@Service("streamService")
public class StreamService {
	@Resource(name = "streamRepository")
    private StreamRepository dao;
	
	long countCalendarSIdIsUsedInAlarm(String sId) {
        return dao.countCalendarSIdIsUsedInAlarm(sId);
    }
}

有需要的,而且,恰好,你也是這麼個套路,那就好啦

那問題就解決啦。