복붙노트

[MONGODB] MongoDB를 GET _id 찾기 쿼리 문자열로

MONGODB

MongoDB를 GET _id 찾기 쿼리 문자열로

여기에 하나의 문서로 컬렉션을 만들었습니다

db.getCollection('example').insert({"example":1});

나는 프로젝션을 사용하려고했고, 나는 _id를 다시 얻을.

db.getCollection('example').find({"example":1},{"_id":1});

{
    "_id" : ObjectId("562a6300bbc948a4315f3abc")
}

아래와 같이 그러나, 나는 출력 아래가 필요합니다.

나는 내 애플 리케이션 서버 # 1과 # 2를 처리 할 수 ​​있지만 얻기 위해 (PHP가 기준) 몽고 자체에서 쿼리에 예상 된 결과를 얻을 수있는 방법이 있다면, 내가 찾고 있어요 OUPUT 원하는

해결법

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

    1.MongoDB를 4.0 $ 변환 집계 연산자하고 정확하게 수행 할 수는 $의 toString 별명을 추가합니다 :

    MongoDB를 4.0 $ 변환 집계 연산자하고 정확하게 수행 할 수는 $의 toString 별명을 추가합니다 :

    db.getCollection('example').aggregate([
      { "$match": { "example":1 } },
      { "$project": { "_id": { "$toString": "$_id" } } }
    ])
    

    문서의 "키"로 _id 값을 사용하지만 주된 사용은 가능성이 가장 높은 것입니다.

    db.getCollection('example').insertOne({ "a": 1, "b": 2 })
    
    db.getCollection('example').aggregate([
      { "$replaceRoot": {
        "newRoot": {
          "$arrayToObject": [
            [{ 
              "k": { "$toString": "$_id" },
              "v": {
                "$arrayToObject": {
                  "$filter": {
                    "input": { "$objectToArray": "$$ROOT" },
                    "cond": { "$ne": ["$$this.k", "_id"] }
                  }
                }
              }
            }] 
          ]
        }
      }}
    ])
    

    어느 반환합니다 :

    { 
      "5b06973e7f859c325db150fd" : { "a" : 1, "b" : 2 }
    }
    

    어떤 다른 예처럼 명확하게 문자열을 보여줍니다.

    일반적으로하지만 일반적으로 문서를 서버에서 반환 될 때 커서의 "변환"을 할 수있는 방법이있다. ObjectId가이 더 많은 공간이 필요 24 자리 16 진수 "문자열"반대로 12 바이트의 바이너리 표현이기 때문에 이것은 일반적으로 좋은 일이있다.

    쉘은 .MAP () 메소드를 갖는다

    db.getCollection('example').find().map(d => Object.assign(d, { _id: d._id.valueOf() }) )
    

    그리고 NodeJS는 거의 같은 일을 할 수있는 Cursor.map ()를 가지고 :

    let cursor = db.collection('example').find()
        .map(( _id, ...d }) => ({ _id: _id.toString(), ...d }));
    
    while ( await cursor.hasNext() ) {
      let doc = cursor.next();
      // do something
    })
    

    그리고 같은 방법뿐만 아니라 (그냥 PHP) 다른 드라이버에 존재하는, 또는 당신은 단지 반복 처리 커서 수와 가능성이 할 수있는 가장 좋은 일이 같은 내용을 변환.

    사실, 전체 커서 결과는 쉘에서 작업 할 때 단순히 문을 반환 모든 커서에 추가하여 큰 쉽게 하나의 개체로 감소시킬 수있다

    .toArray().reduce((o,e) => { 
      var _id = e._id;
      delete e._id;
      return Object.assign(o, { [_id]: e })
    },{ })
    

    또는 전체 ES6 자바 스크립트를 nodejs 같은 환경을 지원하기위한 :

    .toArray().reduce((o,({ _id, ...e })) =>  ({ ...o, [_id]: e }),{ })
    

    집계 프레임 워크에서 처리해야하는 일의 복잡성없이 정말 간단한 물건. 그리고 거의 같은 수단을 통해 다른 언어로 매우 가능합니다.

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

    2.당신은 .aggregate () 메서드를 사용합니다.

    당신은 .aggregate () 메서드를 사용합니다.

    db.getCollection('example').aggregate([ { "$project": { "_id": 0, "id": "$_id" } } ]);
    

    어떤 수율 :

    { "id" : ObjectId("562a67745488a8d831ce2e35") }
    

    또는 .str 속성을 사용.

    db.getCollection('example').find({"example":1},{"_id":1}).map(function(doc) { 
        return {'id': doc._id.str }
    })
    

    어떤 반환 :

    [ { "id" : "562a67745488a8d831ce2e35" } ]
    

    당신이 PHP 드라이버를 사용하고 잘 경우 당신은 이런 식으로 뭔가를 할 수 있습니다 :

    $connection = new MongoClient();
    $db = $connection->test;
    $col = $db->example;
    $cursor = $col->find([], ["_id" => 1]);
    foreach($cursor as $doc) { print_r(array("id" => $doc["_id"])); } 
    

    어떤 수율 :

    Array
    (
        [id] => MongoId Object
            (
                [$id] => 562a6c60f850734c0c8b4567
            )
    
    )
    

    또는 다시 MongoCollection :: 집계 방법을 사용하여.

    $result = $col->aggregate(array(["$project" => ["id" => "$_id", "_id" => 0]]))
    

    그런 다음 foreach 루프를 사용하여 :

    Array
    (
        [_id] => MongoId Object
            (
                [$id] => 562a6c60f850734c0c8b4567
            )
    
    )
    
  3. ==============================

    3.PHP 측에서 MongoCursor을 통과 한 가지 간단한 해결책 ($ 기능, iterator_to_array ($ 커서)) 발전기뿐만 아니라 foreach 문을 사용하거나 array_map하는 것입니다. 예:

    PHP 측에서 MongoCursor을 통과 한 가지 간단한 해결책 ($ 기능, iterator_to_array ($ 커서)) 발전기뿐만 아니라 foreach 문을 사용하거나 array_map하는 것입니다. 예:

    function map_traversable(callable $mapper, \Traversable $iterator) {
        foreach($iterator as $val) {
            yield $mapper($val);
        }
    }
    

    당신은 발전기 구문에 대한 PHP 문서에서 더 만날 수 있습니다.

    그래서, 지금 당신은 어떤이 있지만 적은 반복 금액에 매핑 (파이프 라인은 집계에서와 마찬가지로)의 양 PHP 측에서 데이터를 '투사'의 제안을 위해 (또는 유사한 구현)을 재사용 / 사용할 수 있습니다. 그리고이 솔루션은지도 기능을 재사용하는 경우 OOP에 대한 매우 편리합니다.

    UPD : 다만 아래의 경우 예를 들어 :

    $cursor = $db->getCollection('example')->find(["example":1],["_id":1]);
    $mapper = function($record) {
        return array('id' => (string) $record['_id']); //see \MongoId::__toString()
    }
    $traversableWithIdAsStringApplied = map_traversable($mapper, $cursor);
    //...
    

    이제 당신은 더 많은 매핑이 $ traversableWithIdAsStringApplied에 적용 진행 또는 iterator_to_array 간단한 배열 검색하기위한 바로 사용할 수 있습니다.

  4. from https://stackoverflow.com/questions/33307610/mongodb-get-id-as-string-in-find-query by cc-by-sa and MIT license