복붙노트

[MONGODB] MongoDB를가 ObjectId가에 문자열에서 _id 필드에 가입

MONGODB

MongoDB를가 ObjectId가에 문자열에서 _id 필드에 가입

나는 두 개의 컬렉션을 가지고

_id (사용자 컬렉션에서) - 내가 (역할 컬렉션) 사용자 ID를 실시하고이를 근거로이 모음에 가입하고 싶습니다.

나는 쿼리 아래 시도 :

db.role.aggregate(
{
   $lookup:
   {
       from: 'user',
       localField: 'userId',
       foreignField: '_id',
       as: 'output'
   }
}
);

이것은 내가 ObjectId가 같은 사용자 ID 저장 나를 오랫동안 같은 결과를 예상 제공합니다. 내 userId를 문자열 인 경우에는 결과가 없습니다. 추신 : 나는 시도

. 그러나 경기에 행운이 / A ObjectId가 문자열 필드를 기반으로하지 조인.

어떤 도움을 이해할 수있을 것이다.

해결법

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

    1.이 MongoDB를 3.4로 할 수 없습니다. 이 기능은 이미 요구되었지만, 아직 구현되지 않았습니다. 여기에 해당하는 티켓은 다음과 같습니다 :

    이 MongoDB를 3.4로 할 수 없습니다. 이 기능은 이미 요구되었지만, 아직 구현되지 않았습니다. 여기에 해당하는 티켓은 다음과 같습니다 :

    지금 당신은 ObjectId가 같은 사용자 ID 저장해야합니다

    편집하다

    이전 티켓은 MongoDB를 4.0에서 수정되었습니다. 이제 folowing 쿼리이를 달성 할 수 있습니다 :

    db.user.aggregate([
      {
        "$project": {
          "_id": {
            "$toString": "$_id"
          }
        }
      },
      {
        "$lookup": {
          "from": "role",
          "localField": "_id",
          "foreignField": "userId",
          "as": "role"
        }
      }
    ])
    

    결과:

    [
      {
        "_id": "584aac38686860d502929b8b",
        "role": [
          {
            "_id": ObjectId("584aaca6686860d502929b8d"),
            "role": "Admin",
            "userId": "584aac38686860d502929b8b"
          }
        ]
      }
    ]
    

    온라인으로 시도 : mongoplayground.net/p/JoLPVIb1OLS를

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

    2.당신은 ObjectId가에 문자열 ID를 변환 MongoDB를 4.0 $ toObjectId 집계를 사용할 수 있습니다

    당신은 ObjectId가에 문자열 ID를 변환 MongoDB를 4.0 $ toObjectId 집계를 사용할 수 있습니다

    db.role.aggregate([
      { "$lookup": {
        "from": "user",
        "let": { "userId": "$_id" },
        "pipeline": [
          { "$addFields": { "userId": { "$toObjectId": "$userId" }}},
          { "$match": { "$expr": { "$eq": [ "$userId", "$$userId" ] } } }
        ],
        "as": "output"
      }}
    ])
    

    또는 당신은 String으로 ObjectId가 변환 MongoDB를 4.0 $의 toString 집계를 사용할 수 있습니다

    db.role.aggregate([
      { "$addFields": { "userId": { "$toString": "$_id" }}},
      { "$lookup": {
        "from": "user",
        "localField": "userId",
        "foreignField": "userId",
        "as": "output"
      }}
    ])
    
  3. ==============================

    3.나는 이전의 대답은 '$ toObjectId'경우에 오류가 있다고 생각. 송출 문은 함수 집계가 호출되는 DB 수집 (즉 '역할')에 아닌 컬렉션 "에서"(즉 '사용자')에 의해 지적에 적용됩니다.

    나는 이전의 대답은 '$ toObjectId'경우에 오류가 있다고 생각. 송출 문은 함수 집계가 호출되는 DB 수집 (즉 '역할')에 아닌 컬렉션 "에서"(즉 '사용자')에 의해 지적에 적용됩니다.

    db.role.aggregate([
      { "$lookup": {
        "let": { "userObjId": { "$toObjectId": "$userId" } },
        "from": "user",
        "pipeline": [
          { "$match": { "$expr": { "$eq": [ "$_id", "$$userObjId" ] } } }
        ],
        "as": "userDetails"
      }}
    ])
    

    또는

    db.role.aggregate([
      { "$project": { "userObjId": { "$toObjectId": "$userId" } } },
      { "$lookup": {
        "localField": "userObjId",
        "from": "user",
        "foreignField": "$_id",
        "as": "userDetails"
      }}
    ])
    

    db.user.aggregate([
      { "$project": { "userStrId": { "$toString": "$_id" }}},
      { "$lookup": {
        "localField": "userStrId",
        "from": "role",
        "foreignField": "userId",
        "as": "roleDetails"
      }}
    ])
    
  4. from https://stackoverflow.com/questions/41093647/mongodb-join-on-id-field-from-string-to-objectid by cc-by-sa and MIT license