복붙노트

[MONGODB] 각 문서의 추가 필드와 반응성 게시 구축

MONGODB

각 문서의 추가 필드와 반응성 게시 구축

나는 몇 가지 추가 필드가있는 간행물을 만들고 싶어,하지만 난 하나를 사용 Collection.aggregate에 원하는 컬렉션 변경 (난 그냥 하나 그 안에 self.added 사용할 수 있도록) 할 때 내 게시 업데이트를 잃지 않습니다.

나는 그것을 달성하기 위해 Cursor.observeChanges을 사용할 계획입니다. 나는 두 가지 제약이있다 :

여기에 방법이 제공됩니다 :

self.onStop(function () {
  handle.stop();
});
switch (field) {
  case "item"
    if (!initializing)
      itemCount = raw_document.item.length;
      break;
  default:
}

나는이 방법은 내 코드에서 큰 변화에 커밋하기 전에 좋은 가능하다는 것을 확인하고 싶었다. 이 갈 수있는 올바른 방법 인 경우 캔 사람의 확인 나?

해결법

  1. ==============================

    1.그것은 그들이 데이터베이스 쿼리의 일부인 경우에도 개인 필드를 유지하는 것이 상대적으로 쉽다. 당신은 당신이 클라이언트에 보내는 / 수정 / 삭제 필드를 제거 할 수 있습니다 self.added의 마지막 인수는, 클라이언트로 전달되는 객체입니다.

    그것은 그들이 데이터베이스 쿼리의 일부인 경우에도 개인 필드를 유지하는 것이 상대적으로 쉽다. 당신은 당신이 클라이언트에 보내는 / 수정 / 삭제 필드를 제거 할 수 있습니다 self.added의 마지막 인수는, 클라이언트로 전달되는 객체입니다.

    여기 바이올린의 수정 된 버전입니다. 이것은 당신이 무엇을 요구해야한다. (어쩌면 내가 당신을 오해,하지만 그것을해야합니다 귀하의 질문의 나머지 찾고 있어요는 observeChanges이 바이올린으로 작동 한 후에는 아무것도 체인했던 이유는 확실하지 않다 정직합니다. 미안 내가 잘못을 가지고있는 경우. )

    var self = this;
    
    // Modify the document we are sending to the client.
    function filter(doc) {
      var length = doc.item.length;
    
      // White list the fields you want to publish.
      var docToPublish = _.pick(doc, [
          'someOtherField'
      ]);
    
      // Add your custom fields.
      docToPublish.itemLength = length;
    
      return docToPublish;                        
    }
    
    var handle = myCollection.find({}, {fields: {item:1, someOtherField:1}})
                // Use observe since it gives us the the old and new document when something is changing. 
                // If this becomes a performance issue then consider using observeChanges, 
                // but its usually a lot simpler to use observe in cases like this.
                .observe({
                    added: function(doc) {
                        self.added("myCollection", doc._id, filter(doc));
                    },
                    changed: function(newDocument, oldDocument)
                        // When the item count is changing, send update to client.
                        if (newDocument.item.length !== oldDocument.item.length)
                            self.changed("myCollection", newDocument._id, filter(newDocument));
                    },
                    removed: function(doc) {
                        self.removed("myCollection", doc._id);                    
                    });
    
    self.ready();
    
    self.onStop(function () {
      handle.stop();
    });
    
  2. ==============================

    2.첫 번째 문제를 해결하기 위해, 당신은 커서에 반환해야 필드 것을 MongoDB를 말할 필요가있다. 원하지 않는 필드를 남겨주세요 :

    첫 번째 문제를 해결하기 위해, 당신은 커서에 반환해야 필드 것을 MongoDB를 말할 필요가있다. 원하지 않는 필드를 남겨주세요 :

    MyCollection.find({}, {fields: {'a_field':1}});
    

    두 번째 문제를 해결하는 것은 내가 수집 도우미 패키지를 사용하는 것이 좋습니다 것입니다, 아주 쉽게이기도합니다. 당신과 같이 쉽게이 작업을 수행 할 수 있습니다 :

    // Add calculated fields to MyCollection.
    MyCollection.helpers({
      item_count: function() {
        return this.items.length;
      }
    });
    

    이 객체가 커서에 추가되기 전에 실행되며, MongoDB를 저장하지 동적으로 계산 반환 된 객체에 속성을 만들 것입니다.

  3. from https://stackoverflow.com/questions/30807390/build-a-reactive-publication-with-additional-fields-in-each-document by cc-by-sa and MIT license