복붙노트

[MONGODB] 같은 문서의 필드 MongoDB의 쿼리

MONGODB

같은 문서의 필드 MongoDB의 쿼리

나는 다음 JSON이있다.

{
  "a1": {"a": "b"},
  "a2": {"a": "c"}
}

내가 원하는 모든 서류를 요청할 경우 같은 문서에서 A1 같지 A2.

어떻게 그것을 할 수 있습니까?

해결법

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

    1.당신은 $ 어디에 사용할 수 있습니다 :

    당신은 $ 어디에 사용할 수 있습니다 :

    db.myCollection.find( { $where: "this.a1.a != this.a2.a" } )
    

    이 자바 스크립트 엔진을 회전하고 각각의 모든 문서를 반복하고 각각의 상태를 확인해야합니다 때문에,이 매우 빠른 수 없다는 점에 유의하십시오.

    당신은 큰 컬렉션이 쿼리를 수행해야하는 경우, 또는 매우 자주, 그것은 areEqual처럼 비정규 플래그를 소개하는 것이 가장 좋습니다. 그는 후보 세트가 여전히 크기 때문에 여전히 낮은 선택성 필드, 좋은 인덱스 성능을 얻을 수 없습니다.

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

    2.자바 스크립트가 집계 프레임 워크를 사용하지 않도록하려면 :

    자바 스크립트가 집계 프레임 워크를 사용하지 않도록하려면 :

    db.myCollection.aggregate([
      {"$match":{"a1":{"$exists":true},"a2":{"$exists":true}}},
      {"$project": {
          "a1":1,
          "a2":1,
          "aCmp": {"$cmp":["$a1.a","$a2.a"]}
        }
      },
      {"$match":{"aCmp":0}}
    ])
    

    우리의 개발 서버에 해당하는 자바 스크립트 쿼리를 완료하는 데 7 배 더 오래 걸립니다.

    난 그냥 내 대답은 동일하지 값을 원하는 질문 (때로는 정말 천천히 해요)을 대답하지 않았다 깨달았다. 이것은 그것을 위해 작동합니다 :

    db.myCollection.aggregate([
      {"$match":{"a1":{"$exists":true},"a2":{"$exists":true}}},
      {"$project": {
          "a1":1,
          "a2":1,
          "aEq": {"$eq":["$a1.a","$a2.a"]}
        }
      },
      {"$match":{"aEq": false}}
    ])
    

    경기 조건이 true로 변경된 경우 $ NE는 $ EQ 대신에 사용될 수 있지만, 좀 더 직관적으로 거짓과 $ EQ를 사용하여 찾을 수 있습니다.

  3. ==============================

    3.몽고 3.6으로 사용할 수있는 새 $의 EXPR 연산자를 사용하면이 같은 찾기 쿼리에 집계 식을 사용할 수 있습니다 :

    몽고 3.6으로 사용할 수있는 새 $의 EXPR 연산자를 사용하면이 같은 찾기 쿼리에 집계 식을 사용할 수 있습니다 :

      db.myCollection.find({$expr: {$ne: ["$a1.a", "$a2.a"] } });
    

    이 댓글 해결할 수있는 문제 문제가 있지만, 나는이 사용 사례에 대한 더 나은 경기를 버전 3.4 대신 $ 프로젝트로 사용할 수 $ addFields 연산자를 사용하는 것입니다 생각합니다.

    db.myCollection.aggregate([
         {"$match":{"a1":{"$exists":true},"a2":{"$exists":true}}},
         {"$addFields": {
               "aEq": {"$eq":["$a1.a","$a2.a"]}
             }
         },
         {"$match":{"aEq": false}} 
      ]);
    
  4. ==============================

    4.MongoDB를 이렇게 백그라운드에서 자바 스크립트를 사용하여

    MongoDB를 이렇게 백그라운드에서 자바 스크립트를 사용하여

    {"a": "b"} == {"a": "b"}
    

    거짓 일 것이다.

    그래서 것 가지고 a1.a == a2.a 각각 비교

    MongoDB의에서이 작업을 수행하려면 어디 연산자 $를 사용합니다

    db.myCollection.find({$where: "this.a1.a != this.a2.a"});
    

    이것은 각 포함 된 문서 속성 "A"를 가지고 있다고 가정. 그런 경우가 아닌 경우 상황이 더 복잡해진다.

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

    5.내 모든 문제를 해결하기위한 감사합니다 - 사용 집계는 (), 처음에 저를 혼동 한 가지 $ EQ (또는 $, 또는 다른 사업자의 많은)가 사용되는 위치에 따라 다른 의미를 가지고 있다는 답변에 관하여. 찾은 내용 () 또는 응집 $ 정합 단계에서 $ 당량은 단일 값, 및 문서를 매칭 선택을 취

    내 모든 문제를 해결하기위한 감사합니다 - 사용 집계는 (), 처음에 저를 혼동 한 가지 $ EQ (또는 $, 또는 다른 사업자의 많은)가 사용되는 위치에 따라 다른 의미를 가지고 있다는 답변에 관하여. 찾은 내용 () 또는 응집 $ 정합 단계에서 $ 당량은 단일 값, 및 문서를 매칭 선택을 취

    db.items.aggregate([{$match: {_id: {$eq: ObjectId("5be5feb45da16064c88e23d4")}}}])
    

    그러나 통합의 $ 프로젝트 단계에서, $ 당량이 표현의 배열을 받아, 진정한 가치 또는 false로 새 필드를합니다 :

    db.items.aggregate([{$project: {new_field: {$eq: ["$_id", "$foreignID"]}}}])
    

    통과에서, 여기에 그 목록에 링크 된 항목 (버그로 인해) 그 자체에 연결된 모든 항목을 찾을 수 내 프로젝트에 사용 된 쿼리 I는 다음과 같습니다

    db.items.aggregate([{$project: {idIn: {$in: ["$_id","$header.links"]}, "header.links": 1}}, {$match: {idIn: true}}])
    
  6. from https://stackoverflow.com/questions/8433046/mongodb-query-with-fields-in-the-same-documents by cc-by-sa and MIT license