복붙노트

[MONGODB] 어떻게 같은 성명을 채우고 집계를 사용 하는가?

MONGODB

어떻게 같은 성명을 채우고 집계를 사용 하는가?

이것은 나의 약속 모음입니다 :

{ _id: ObjectId("518ee0bc9be1909012000002"), date: ISODate("2013-05-13T22:00:00Z"), patient:ObjectId("518ee0bc9be1909012000002") }

{ _id: ObjectId("518ee0bc9be1909012000002"), date: ISODate("2013-05-13T22:00:00Z"), patient:ObjectId("518ee0bc9be1909012000002") }

{ _id: ObjectId("518ee0bc9be1909012000002"), date: ISODate("2013-05-13T22:00:00Z"), patient:ObjectId("518ee0bc9be1909012000002") }

나는 다음과 같은 결과를 얻을 수 집계 사용

{date: ISODate("2013-05-13T22:00:00Z"),
patients:[ObjectId("518ee0bc9be1909012000002"),ObjectId("518ee0bc9be1909012000002"),ObjectId("518ee0bc9be1909012000002")] }

이 같은 :

Appointments.aggregate([
{$group: {_id: '$date', patients: {$push: '$patient'}}},
{$project: {date: '$_id', patients: 1, _id: 0}}
], ...)

나는 환자 문서를 채울 수있는 방법 나는이 시도했지만 작동 ... Appointments.find ({}). 채우기 ( "환자")를하지 않습니다. 골재 ....

즉, 내가 같은 문에 채우고 집계를 사용할 수 있습니다

어떤 도움 바랍니다

해결법

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

    1.몽구스의 최신 버전 (몽구스> = 3.6)으로, 당신은하지만 두 번째 쿼리를 필요로하고, 다른 채우기를 사용 할 수 있습니다. 당신 집계 한 후,이 작업을 수행 :

    몽구스의 최신 버전 (몽구스> = 3.6)으로, 당신은하지만 두 번째 쿼리를 필요로하고, 다른 채우기를 사용 할 수 있습니다. 당신 집계 한 후,이 작업을 수행 :

    Patients.populate(result, {path: "patient"}, callback);
    

    몽구스 API와 몽구스의 문서에서 더 많은 참조하십시오.

  2. ==============================

    2.당신은 채울 유사하다 $ 조회를 사용할 수 있습니다.

    당신은 채울 유사하다 $ 조회를 사용할 수 있습니다.

    관련이없는 예제에서는 레코드에 대한 쿼리 및 이러한 기록의 하위 속성으로 외국 모델을 채우는 $ 조회에 $ 일치를 사용합니다 :

      Invite.aggregate(
          { $match: {interview: req.params.interview}},
          { $lookup: {from: 'users', localField: 'email', foreignField: 'email', as: 'user'} }
        ).exec( function (err, invites) {
          if (err) {
            next(err);
          }
    
          res.json(invites);
        }
      );
    
  3. ==============================

    3.A는 $ 조회에 가입 수행

    A는 $ 조회에 가입 수행

    모음의 순서는 다음과 같은 문서가 포함되어 있습니다 :

    { "_id" : 1, "item" : "abc", "price" : 12, "quantity" : 2 }
    { "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1 }
    { "_id" : 3  }
    

    또 다른 수집 목록은 다음과 같은 문서가 포함되어 있습니다 :

    { "_id" : 1, "sku" : "abc", description: "product 1", "instock" : 120 }
    { "_id" : 2, "sku" : "def", description: "product 2", "instock" : 80 }
    { "_id" : 3, "sku" : "ijk", description: "product 3", "instock" : 60 }
    { "_id" : 4, "sku" : "jkl", description: "product 4", "instock" : 70 }
    { "_id" : 5, "sku": null, description: "Incomplete" }
    { "_id" : 6 }
    

    주문 수집에 대한 다음 집계 작업은 주문 수집 및 재고 컬렉션에서 SKU 필드에서 필드 항목을 사용하여 인벤토리 수집에서 문서와 주문에서 문서를 조인

    db.orders.aggregate([
        {
          $lookup:
            {
              from: "inventory",
              localField: "item",
              foreignField: "sku",
              as: "inventory_docs"
            }
       }
    ])
    

    동작은 다음과 같은 문서를 반환합니다 :

    {
      "_id" : 1,
       "item" : "abc",
      "price" : 12,
      "quantity" : 2,
      "inventory_docs" : [
        { "_id" : 1, "sku" : "abc", description: "product 1", "instock" : 120       }
      ]
     }
    {
      "_id" : 2,
      "item" : "jkl",
      "price" : 20,
      "quantity" : 1,
      "inventory_docs" : [
        { "_id" : 4, "sku" : "jkl", "description" : "product 4", "instock" : 70 }
      ]
    }
    {
      "_id" : 3,
      "inventory_docs" : [
        { "_id" : 5, "sku" : null, "description" : "Incomplete" },
        { "_id" : 6 }
      ]
    }
    

    참조 $ 조회

  4. ==============================

    4.이 같은 한 쿼리에서 그것을 할 수 있습니다 :

    이 같은 한 쿼리에서 그것을 할 수 있습니다 :

    Appointments.aggregate([{
            $group: {
                _id: '$date',
                patients: {
                    $push: '$patient'
                }
            }
        },
        {
            $project: {
                date: '$_id',
                patients: 1,
                _id: 0
            }
        },
        {
            $lookup: {
                from: "patients",
                localField: "patient",
                foreignField: "_id",
                as: "patient_doc"
            }
        }
    ])
    

    기본적으로 채울 후드 $ 조회를 사용합니다. 이 경우에는 두 번째 쿼리에 대한 필요가 없습니다. 자세한 내용은 확인 MongoDB를 집계 조회

  5. ==============================

    5.짧은 답변: 당신은 할 수 없습니다.

    짧은 답변: 당신은 할 수 없습니다.

    긴 대답 : 집계 프레임 워크에서 반환 된 필드는 사용자에 의해 구축하고있는 거를 수있는 "이름 바꾸기"문서 속성.

    이것이 의미하는 것은 몽구스 당신의 참조 문서는 최종 결과에 사용할 수 있음을 식별 할 수 있다는 것입니다.

    이 같은 상황에서 할 수있는 가장 좋은 방법은 쿼리가 리턴 한 후 원하는 필드를 채울 수 있습니다. 네, 두 DB 호출을 초래하지만, MongoDB를 우리가 수행 할 수거야.

    다소 같은 :

    Appointments.aggregate([ ... ], function( e, result ) {
      if ( e ) return;
    
      // You would probably have to do some loop here, as probably 'result' is array
      Patients.findOneById( result.patient, function( e, patient ) {
        if ( e ) return;
    
        result.patient = patient;
      });
    });
    
  6. ==============================

    6.

    domain.Farm.aggregate({
        $match: {
            "_id": mongoose.Types.ObjectId(farmId)
        }
    }, {
        $unwind: "$SelfAssessment"
    }, {
        $match: {
            "SelfAssessment.questionCategoryID": QuesCategoryId,
            "SelfAssessment.questionID": quesId
        }
    },function(err, docs) {
          var options = {
              path: 'SelfAssessment.actions',
              model: 'FarmAction'
         };
         domain.Farm.populate(docs, options, function (err, projects) {
           callback(err,projects);
    
          });
    
    });
    

    나는 행동 모델 채우기있어 결과

    {   "error": false,   "object": [
        {
          "_id": "57750cf6197f0b5137d259a0",
          "createdAt": "2016-06-30T12:13:42.299Z",
          "updatedAt": "2016-06-30T12:13:42.299Z",
          "farmName": "abb",
          "userId": "57750ce2197f0b5137d2599e",
          "SelfAssessment": {
            "questionName": "Aquatic biodiversity",
            "questionID": "3kGTBsESPeYQoA8ae2Ocoy",
            "questionCategoryID": "5aBe7kuYWIEoyqWCWcAEe0",
            "question": "Waterways protected from nutrient runoff and stock access through fencing, buffer strips and off stream watering points",
            "questionImage": "http://images.contentful.com/vkfoa0gk73be/4pGLv16BziYYSe2ageCK04/6a04041ab3344ec18fb2ecaba3bb26d5/thumb1_home.png",
            "_id": "57750cf6197f0b5137d259a1",
            "actions": [
              {
                "_id": "577512c6af3a87543932e675",
                "createdAt": "2016-06-30T12:38:30.314Z",
                "updatedAt": "2016-06-30T12:38:30.314Z",
                "__v": 0,
                "Evidence": [],
                "setReminder": "",
                "description": "sdsdsd",
                "priority": "High",
                "created": "2016-06-30T12:38:30.312Z",
                "actionTitle": "sdsd"
              }
            ],
            "answer": "Relevant"
          },
          "locations": []
        }   ],   "message": "",   "extendedMessage": "",   "timeStamp": 1467351827979 }
    
  7. ==============================

    7.당신은 할 일 명 성명에서, 두를해야한다.

    당신은 할 일 명 성명에서, 두를해야한다.

    await를 시나리오 비동기에서 채우기까지 확인 await를합니다.

    CONST 약속 AWAIT Appointments.aggregate = ([...]); AWAIT Patients.populate (약속 {경로 "환자"}); 약속을 반환;

    또는 (제한하려는 경우)

    AWAIT Patients.populate (약속 {경로 "환자"선택 {_id : 1, 전체 이름 : 1}});

  8. from https://stackoverflow.com/questions/16680015/how-to-use-populate-and-aggregate-in-same-statement by cc-by-sa and MIT license