[MONGODB] MongoDB를 GET _id 찾기 쿼리 문자열로
MONGODBMongoDB를 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.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.당신은 .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.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 간단한 배열 검색하기위한 바로 사용할 수 있습니다.
from https://stackoverflow.com/questions/33307610/mongodb-get-id-as-string-in-find-query by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB의에서 현지 시간대와 날짜 별 그룹 (0) | 2019.12.20 |
---|---|
[MONGODB] 각 그룹에 대해 마지막으로 "true"로 값을 반환 (0) | 2019.12.20 |
[MONGODB] 날짜 별 자바 / MongoDB의 쿼리 (0) | 2019.12.20 |
[MONGODB] 어떻게하여 MongoDB에서 필드를 증가 하는가? (0) | 2019.12.20 |
[MONGODB] 나는 MongoDB를 사용하여 이미지를 저장하기 위해 어떤 데이터 유형을 사용해야합니까? (0) | 2019.12.20 |