수색…


비고

Mongo 콜렉션을 생각하는 유용한 방법은 Who, What, When, Where, Why, How의 관점입니다. Mongo는 다양한 유형의 데이터에 대해 다음과 같은 최적화 기능을 제공합니다.

어디서 - GeoJSON
When - ObjectID 타임 스탬프
Who - Meteor 계정 문자열
방법 - 의사 결정 트리 용 JSON

Mongo의 기본 문서는 대략 'What'를 나타냅니다.

레거시 데이터베이스에 레코드 만들기

idGeneration 필드를 사용하여 컬렉션을 정의하면 일반 Mongo 형식을 기본값으로 사용할 수 있습니다.

MyCollection = new Meteor.Collection('mycollection', {idGeneration : 'MONGO'});

문서에 데이터 삽입

Mongo 초보자는 배열, 날짜, 부울, 세션 변수 등을 문서 레코드에 삽입하는 방법과 같은 기본 사항에 대해 고심합니다. 이 예제는 기본 데이터 입력에 대한 지침을 제공합니다.

Todos.insert({
  text: "foo",                        // String
  listId: Session.get('list_id'),     // String
  value: parseInt(2),                 // Number
  done: false,                        // Boolean
  createdAt: new Date(),              // Dimestamp
  timestamp: (new Date()).getTime(),  // Time
  tags: []                            // Array
});

가장 최근에 생성 된 문서의 _id 가져 오기

동 기적으로 가져올 수 있습니다.

var docId = Todos.insert({text: 'foo'});
console.log(docId);

또는 비동기 적으로 :

Todos.insert({text: 'foo'}, function(error, docId){
  console.log(docId);
});

월간 데이터

MongoDB를 시계열 데이터로 사용하는 것은 공식 문서 및 프레젠테이션과 함께 유스 케이스 (well-use document)와 확립 된 유스 케이스입니다. MongoDB의 공식 문서를 읽고 시계를 작성하여 시계열 데이터에 대한 스키마를 직접 작성하십시오.

시계열 데이터 용 MongoDB

일반적으로, 당신은 당신의 timeseries 데이터를위한 버킷을 만들고 싶을 것입니다 :

DailyStats.insert({
   "date" : moment().format("MM-DD-YYYY"),
   "dateIncrement" : moment().format("YYYYMMDD"),
   "dailyTotal" : 0,
   'bucketA': 0,
   'bucketB': 0,
   'bucketC': 0
   });

그런 다음 응용 프로그램에 데이터를 공급할 때 해당 버킷을 증가시킵니다. 이 증분은 Meteor Method, 콜렉션 관측기, REST API 엔드 포인트 및 다양한 다른 장소에 놓을 수 있습니다.

DailyStats.update({_id: doc._id}, {$inc: {bucketA: 1} });

보다 완벽한 Meteor 예제는 Clinical Meteor 트랙의 예제를 참조하십시오.

실시간 분석 파이프 라인
임상 유성 - 그래프 - Dailystats

Regexes로 필터링

regexes, 반응 형 세션 변수 및 deps autoruns를 사용하여 서버에서 구독을 필터링하는 간단한 패턴.

// create our collection
WordList =  new Meteor.Collection("wordlist");

// and a default session variable to hold the value we're searching for
Session.setDefault('dictionary_search', '');

Meteor.isClient(function(){
    // we create a reactive context that will rerun items when a Session variable gets updated 
    Deps.autorun(function(){
        // and create a subscription that will get re-subscribe to when Session variable gets updated
        Meteor.subscribe('wordlist', Session.get('dictionary_search'));
    });

    Template.dictionaryIndexTemplate.events({
        'keyup #dictionarySearchInput': function(evt,tmpl){
            // we set the Session variable with the value of our input when it changes
            Session.set('dictionary_search', $('#dictionarySearchInput').val());
        },
        'click #dictionarySearchInput':function(){
            // and clear the session variable when we enter the input
            Session.set('dictionary_search', '');
        },
    });
});
Meteor.isServer(function(){
    Meteor.publish('wordlist', function (word_search) {
        // this query gets rerun whenever the client subscribes to this publication
        return WordList.find({
            // and here we do our regex search
            Word: { $regex: word_search, $options: 'i' }
        },{limit: 100});
    });
});

그리고 클라이언트에서 사용되는 HTML :

<input id="dictionarySearchInput" type="text" placeholder="Filter..." value="hello"></input>

이 패턴 자체는 꽤 간단하지만 정규 표현식이 아닐 수도 있습니다. regexes에 익숙하지 않다면 다음과 같은 유용한 자습서와 링크가 있습니다.

정규식 튜토리얼
정규식 치트 시트
Javascript의 정규 표현식

지형 공간 컬렉션 - 더 배우기

지형 공간 컬렉션은 일반적으로 Mongo 데이터베이스에 GeoJSON을 저장하고, 클라이언트에 해당 데이터를 스트리밍하고, 브라우저의 window.navigator.geolocation 액세스하고, Map API를로드하고, GeoJSON을 LatLngs로 변환하고,지도에 플로팅하는 작업을 포함합니다. 바람직하게는 실시간으로 모두. 다음은 시작할 수있는 리소스 목록입니다.

컬렉션 쿼리 감사

다음 예제는 모든 콜렉션 조회를 실시간으로 서버 콘솔에 기록합니다.

Meteor.startup(     
  function () {     
    var wrappedFind = Meteor.Collection.prototype.find;     

    // console.log('[startup] wrapping Collection.find')        

    Meteor.Collection.prototype.find = function () {        
      // console.log(this._name + '.find', JSON.stringify(arguments))       
      return wrappedFind.apply(this, arguments);        
    }       
  },        

  function () {     
    var wrappedUpdate = Meteor.Collection.prototype.update;     

    // console.log('[startup] wrapping Collection.find')        

    Meteor.Collection.prototype.update = function () {      
      console.log(this._name + '.update', JSON.stringify(arguments))        
      return wrappedUpdate.apply(this, arguments);      
    }       
  }     
);      

옵서버 및 작업자 기능

노드 이벤트 루프가 자전거 체인처럼 작동하면 서버 측 컬렉션 옵저버는 변속기와 같습니다. 데이터가 들어올 때 데이터 수집에 앉을 기어링 메커니즘입니다. 모든 경주 용 자전거가 변속기처럼 성능이 뛰어납니다. 그러나 이것은 전체 시스템을 파괴하기위한 소스이기도합니다. 그것은 당신에게 날아갈 수있는 고속 반응 기능입니다. 경고 받다.

Meteor.startup(function(){
  console.log('starting worker....');

  var dataCursor = Posts.find({viewsCount: {$exists: true}},{limit:20});

  var handle = dataCursor.observeChanges({
    added: function (id, record) {
      if(record.viewsCount > 10){
         // run some statistics
         calculateStatistics();

         // or update a value
         Posts.update({_id: id}, {$set:{
           popular: true
         }});

      }
    },
    removed: function () {
      console.log("Lost one.");
    }
  });
});

20의 한도는 변속기의 크기입니다 ... 얼마나 많은 치아가 있는지; 또는 더 구체적으로는 컬렉션을 걷는 동안 커서에있는 항목 수를 나타냅니다. 이런 종류의 함수에서 'var'키워드 사용에주의하십시오. 메모리에 가능한 한 적은 수의 객체를 작성하고 추가 된 메소드 내에서 객체 재사용에 집중하십시오. opslog가 켜지고이 일이 최고 속도로 진행될 때 Node 가비지 컬렉터가 객체를 메모리 힙에 빠르게 기록하는 경우 불쾌한 메모리 누출을 노출 할 수있는 주요 후보가됩니다.

각 Meteor 인스턴스가 동일한 레코드를 업데이트하려고하므로 위의 솔루션은 수평 확장이 잘되지 않습니다. 따라서 수평 적으로 확장하려면 일종의 환경 감지가 필요합니다.

클러스터의 여러 시스템에서 서비스 작업자를 동기화하는 훌륭한 예는 percolatestudios:synced-cron synced percolatestudios:synced-cron 패키지를 참조하십시오.
유성 - 동기화 - cron



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow