2017-10-25 3 views
0

$ setIntersection을 객체와 함께 사용할 수없는 것 같습니다.

예 :

개체 1 :

[ 
    {name: "test5", value:5}, 
    {name: "test4", value:4}, 
    {name: "test3", value:3}, 
    {name: "test2", value:2} 
] 

개체 2 :

이 이
[ 
    {name: "test5", value:5}, 
    {name: "test422", value:422}, 
    {name: "test333", value:3333}, 
    {name: "test211", value:211} 
] 

$ setIntersection이 대신 나를 []을 반환 :

[ 
    {name: "test5', value:5} 
] 

$하는 경우 setIntersection은 그리 좋지 않습니다. 개체와 k, 내가 사용할 수있는 주위에 어떤 작품이 있습니까?

+0

실제로 어떤 코드를 실행하고 있습니까? 왜냐하면 내가 올바른 구조로하면 올바른 결과를 얻을 수 있기 때문입니다. 당신이하고있는 일을 정확히 진술했다면 JavaScript 객체 할당에서'= '가 없다는 사실을 깨닫게 될 것입니다.'가치 : 5'를 의미합니다. –

+0

오 예. 나는 의미했다 : = 대신. node.js와 함께 mongodb를 실행 중입니다. – Bosen

답변

1

당신이 잘못을하고있는 것 같다

db.test.insert({ 
    "a" : [ 
     { 
      "name" : "test5", 
      "value" : 5.0 
     }, 
     { 
      "name" : "test4", 
      "value" : 4.0 
     }, 
     { 
      "name" : "test3", 
      "value" : 3.0 
     }, 
     { 
      "name" : "test2", 
      "value" : 2.0 
     } 
    ] 
}) 

내가 $setInsersection와 함께 .aggregate()을 실행 그리고 객체의 제공된 배열은 이렇게 :

같이 속성 인 경우

/* 1 */ 
{ 
    "_id" : ObjectId("59f02df75b9b8bb266a563cb"), 
    "a" : [ 
     { 
      "name" : "test5", 
      "value" : 5.0 
     } 
    ] 
} 

"반전"그런 다음

나는 예상 된 결과를 얻을 수 있기 때문에 예상한다으로

db.getCollection('test').aggregate([ 
    { "$project": { 
    "a": { 
     "$setIntersection": [ 
     "$a", 
     [ 
      { value: 5, name: "test5" }, 
      {name: "test422", value: 422}, 
      {name: "test333", value: 3333}, 
      {name: "test211", value: 211} 
     ] 
     ]  
    } 
    }} 
]) 

그런 다음 결과 배열이 "빈"입니다 { "name": "test5", "value": 5 }은 "세트"에 관한 한 { "value": 5, "test": name }과 같지 않습니다.

+0

두 배열이 실제로 같은 문서의 필드 일 때이 기능이 작동합니까? 왜냐하면 나는 이것을'$ setIntersection : [ "$ field1", "$ field2"]'처럼 사용하기 때문이다. 필드 1과 필드 2의 형식은 내가 사용한 예와 같습니다. – Bosen

+0

@CodingNoobie "필드"는 "필드"이고 "배열"은 "배열"입니다. 두 가지. '$ setIntersection : [[ "$ field1"], [ "$ field2"]]'배열에서 "단수"값을 래핑 할 수는 있지만,'$ eq : [ "$ field1 ","$ field2 "]'대신에. 잘못된 질문을하는 것 같습니다. 아마도 [새 질문하기] (https://stackoverflow.com/questions/ask)를 참조하고 필요할 때 무엇을 묻고 있는지 분명히해야합니다. 이것은''array comparison '에 응답하는데, 이것은'$ setIntersection'이하는 일입니다. –

+0

아, 필드는 실제로 배열입니다. 예 :'fieldName : [] ' – Bosen

0

두 개의 서로 다른 문서의 배열을 비교할 수 없습니다. 이 작업을 수행하려면이 두 배열이 동일한 문서에 있거나 (필드 이름 대신 인수로 직접 제공되어야 함) 필요합니다.

$setIntersection은 두 개 이상의 배열을 입력으로 사용합니다. 다른 문서의 오브젝트를 비교하지 않습니다. 이는 내가하는 일이라고 생각합니다.

다음 명령은 나를 위해 잘 작동 :
삽입 :

db.mycol.insert({f1:[ 
    {name: "test5", value:5}, 
    {name: "test4", value:4}, 
    {name: "test3", value:3}, 
    {name: "test2", value:2} 
],f2:[ 
    {name: "test5", value:5}, 
    {name: "test422", value:422}, 
    {name: "test333", value:3333}, 
    {name: "test211", value:211} 
]}) 

출력 :
WriteResult({ "nInserted" : 1 })

집계 :

db.mycol.aggregate([{$project:{com:{$setIntersection:["$f1","$f2"]}}}]) 
,363,210

출력 :

내가 지금과 같은 배열 개체를 삽입하는 경우 :

{ "_id" : ObjectId("59f02eba7f11fa2e1df15e53"), "com" : [ { "name" : "test5", "value" : 5 } ] } 
+0

"동일한 문서에 있어야"하는 필요는 없습니다. BSON의 모든 구성은 완벽하게 유효합니다. "실용적이지는 않지만"연산자를 인수로 "두"배열을 제출할 수 있습니다. "적어도 하나"가 문서 자체에 존재하는 것이 일반적으로 더 실용적입니다. 그러나 "요구 사항"이 아닙니다. –

+0

제 요점은 다른 워드 프로세서의 배열을 비교할 수 없다는 것이 었습니다. 예, 전체 배열을 인수로 제공하면 작동하며 기술적으로는 "동일한 문서에 포함되지 않습니다." –

+0

본 유일한 "포인트"는 본질적으로 올바르지 않습니다. 그래서 나는 당신이 "잘못"하고있는 것을 당신에게 알려주고 있습니다. 아무도 "다른 문서"에 대해 아무 말도하지 않았으며 기본적으로 "스스로 만들었습니다". 그 질문과 아무런 관련이 없습니다. –

관련 문제