NOT와 AND를 함께 사용하는 MongoDB
나는 부정하려고 노력하고 있습니다.$and
MongoDB의 조항과 나는 받고 있습니다.MongoError: invalid operator: $and
메시지 회신기본적으로 제가 이루고 싶은 것은 다음과 같습니다.
query = { $not: { $and: [{institution_type:'A'}, {type:'C'}] } }
이것을 mongo 쿼리로 표현할 수 있습니까?
다음은 샘플 컬렉션입니다.
{ "institution_type" : "A", "type" : "C" }
{ "institution_type" : "A", "type" : "D" }
{ "institution_type" : "B", "type" : "C" }
{ "institution_type" : "B", "type" : "D" }
제가 돌려받고 싶은 것은 다음과 같습니다.
{ "institution_type" : "A", "type" : "D" }
{ "institution_type" : "B", "type" : "C" }
{ "institution_type" : "B", "type" : "D" }
찾으시는 제품NOT (A AND C)
와 동등한.NOT A OR NOT C
:
db.collection.find({
"$or": [
{"institution_type": {"$ne": "A"}},
{"type": {"$ne": "C"}}
]
})
MongoDB는 또한 $norlogical 연산자를 가지고 있는데, 이 연산자는 "하나 이상의 쿼리 표현식 배열에 대해 논리적 NOR 연산을 수행하고 배열의 모든 쿼리 표현식에 실패하는 문서를 선택한다"고 합니다.
db.collection.find({
"$nor": [
{"institution_type": "A"},
{"type": "C"}
]
})
승인된 답변은 다음을 사용할 것을 권장합니다.$where
연산자, 하지만 여기서는 불필요하며 성과에 세금을 부과합니다.
제가 볼 수 있는 표준 부정이 아니라 자바스크립트를 사용하는 운영자 스타일 쿼리가 필요합니다.
db.collection.find(function(){
return !( this.institution_type == "A" && this.type == "C" )
})
전체 컬렉션을 검색하는 것만큼 최선은 아니지만 두 값을 모두 테스트해야 하기 때문에 논리에서 부정이 필요합니다.
또는 기본적으로 동등한 집계 작업:
db.collection.aggregate([
{ "$project": {
"institution_type": 1,
"type": 1,
"notmatched": {
"$not": {
"$and": [
{ "eq": [ "$institution_type", "A" ] },
{ "eq": [ "$type", "C" ] }
]
}
}
}},
{ "$match": {
"notmatched": true
}}
])
내부에 부정을 포함시킴으로써 이것 또한 유효한 형태라는 것을 방금 깨달았습니다.
db.collection.find({
"$or": [
{ "institution_type": { "$ne": "A" } },
{ "type": { "$ne": "C" }},
]
})
여기서 다른 논리가 "아니오" 조건으로 래핑하는 것과 마찬가지로 동일한 문서에서 "A"와 "C"의 조합을 기본적으로 부정합니다.
기원
MongoDB 쿼리에서 은 쿼리에서 용어의 기본 비교이기 때문에 실제로 암시적입니다.동일한 필드에서 여러 조건을 찾을 때만 사용하면 됩니다.
하지만 당신의 질문은 단순한 불평등 일치입니다.
db.collection.find({
"institution_type": { "$ne": "bank" },
"type": { "$ne": "account_type" }
})
따라서 연산자를 사용하여 일치하는 조건을 부정하는 반면, 이미 언급한 바와 같이 은 암시적이므로 두 조건이 모두 적용되어야 합니다.
샘플 데이터를 사용하면 다음과 같습니다.
{ "institution_type" : "bank", "type" : "account_type" }
{ "institution_type" : "school", "type" : "account_type" }
{ "institution_type" : "school", "type" : "account" }
쿼리는 두 조건을 모두 충족하지 않는 행만 반환합니다.
{ "institution_type" : "school", "type" : "account" }
당신의 의견은 당신이 "AND"를 사용하고 있기 때문에 당신이 쿼리에서 지정하지 않은 "OR"을 원한다고 말하기 때문에 아마도 당신은 제가 말한 것과 반대인 "OR"이 암시적이라고 예상하고 있을 것입니다.
조건을 명시적으로 적용해야 합니다.
db.collection.find({
"$or": [
{ "inititution_type": { "$ne": "bank" } },
{ "type": { "$ne": "account_type" } }
]
})
이것은 실제로 이중 부정이며 모든 결과를 반환합니다.
아마도 당신의 말은 다음과 같습니다.
db.data.find({
"$nor": [
{ "inititution_type": "bank" },
{ "type": "account_type" }
]
})
하지만 사실 그것은 제가 당신에게 준 첫 번째 질문과 논리적으로 같습니다.
저도 같은 문제가 있지만, 해결되지 않았습니다.
내 컬렉션에는 다음 항목이 있습니다(총 17개).
{
"_id" : ObjectId("5d9d09dff9399554b35f4fc8"),
"status" : {
"codigo" : "1",
"msg" : "Ativo"
},
"extra" : [
],
"tipo" : "amizade",
"vinculo" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d69a8eb0215c92942fd0983")
},
"vinculado" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d6821c70215c9e5e5fd096b")
},
"createdAt" : ISODate("2019-10-08T22:12:47.872+0000"),
"updatedAt" : ISODate("2019-10-08T22:12:47.872+0000"),
"__v" : NumberInt(0)
}
// ----------------------------------------------
{
"_id" : ObjectId("5d9d09dff9399553df5f4fc9"),
"status" : {
"codigo" : "1",
"msg" : "Ativo"
},
"extra" : [
],
"tipo" : "amizade",
"vinculo" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d6821c70215c9e5e5fd096b")
},
"vinculado" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d69a8eb0215c92942fd0983")
},
"createdAt" : ISODate("2019-10-08T22:12:47.883+0000"),
"updatedAt" : ISODate("2019-10-08T22:13:10.129+0000"),
"__v" : NumberInt(0)
}
// ----------------------------------------------
{
"_id" : ObjectId("5d9d0a00f93995da635f4fca"),
"status" : {
"codigo" : "1",
"msg" : "Ativo"
},
"extra" : [
],
"tipo" : "vacuo",
"vinculo" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d69a8eb0215c92942fd0983")
},
"vinculado" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d6821c70215c9e5e5fd096b")
},
"createdAt" : ISODate("2019-10-08T22:13:20.310+0000"),
"updatedAt" : ISODate("2019-10-08T22:13:20.310+0000"),
"__v" : NumberInt(0)
}
// ----------------------------------------------
{
"_id" : ObjectId("5d9d0a44de4e534ba8a1eaf6"),
"status" : {
"codigo" : "1",
"msg" : "Ativo"
},
"extra" : [
],
"tipo" : "nao-sugerir",
"vinculo" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d69a8eb0215c92942fd0983")
},
"vinculado" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d833a2a7aebc4af5ba378ca")
},
"createdAt" : ISODate("2019-10-08T22:14:28.445+0000"),
"updatedAt" : ISODate("2019-10-08T22:14:28.445+0000"),
"__v" : NumberInt(0)
}
// ----------------------------------------------
{
"_id" : ObjectId("5d9d0a48de4e534ba8a1eaf7"),
"status" : {
"codigo" : "1",
"msg" : "Ativo"
},
"extra" : [
],
"tipo" : "nao-sugerir",
"vinculo" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d6821c70215c9e5e5fd096b")
},
"vinculado" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d82c2e07aebc4305da378b1")
},
"createdAt" : ISODate("2019-10-08T22:14:32.189+0000"),
"updatedAt" : ISODate("2019-10-08T22:14:32.189+0000"),
"__v" : NumberInt(0)
}
// ----------------------------------------------
{
"_id" : ObjectId("5d9d0b28de4e534ba8a1eaf8"),
"status" : {
"codigo" : "1",
"msg" : "Ativo"
},
"extra" : [
],
"tipo" : "amizade",
"vinculo" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d6821c70215c9e5e5fd096b")
},
"vinculado" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d82de827aebc42767a378c6")
},
"createdAt" : ISODate("2019-10-08T22:18:16.235+0000"),
"updatedAt" : ISODate("2019-10-08T22:18:16.235+0000"),
"__v" : NumberInt(0)
}
// ----------------------------------------------
{
"_id" : ObjectId("5d9d0b28de4e534ba8a1eaf9"),
"status" : {
"codigo" : "2",
"msg" : "Solicitação pendente"
},
"extra" : [
],
"tipo" : "amizade",
"vinculo" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d82de827aebc42767a378c6")
},
"vinculado" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d6821c70215c9e5e5fd096b")
},
"createdAt" : ISODate("2019-10-08T22:18:16.268+0000"),
"updatedAt" : ISODate("2019-10-08T22:18:16.268+0000"),
"__v" : NumberInt(0)
}
// ----------------------------------------------
{
"_id" : ObjectId("5d9d10eede4e534ba8a1eb0d"),
"status" : {
"codigo" : "1",
"msg" : "Ativo"
},
"extra" : [
],
"tipo" : "amizade",
"vinculo" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d6821c70215c9e5e5fd096b")
},
"vinculado" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d82755c7aebc49efca378aa")
},
"createdAt" : ISODate("2019-10-08T22:42:54.790+0000"),
"updatedAt" : ISODate("2019-10-08T22:42:54.790+0000"),
"__v" : NumberInt(0)
}
// ----------------------------------------------
{
"_id" : ObjectId("5d9d10eede4e534ba8a1eb0e"),
"status" : {
"codigo" : "2",
"msg" : "Solicitação pendente"
},
"extra" : [
],
"tipo" : "amizade",
"vinculo" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d82755c7aebc49efca378aa")
},
"vinculado" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d6821c70215c9e5e5fd096b")
},
"createdAt" : ISODate("2019-10-08T22:42:54.822+0000"),
"updatedAt" : ISODate("2019-10-08T22:42:54.822+0000"),
"__v" : NumberInt(0)
}
// ----------------------------------------------
{
"_id" : ObjectId("5d9dad94f939952d305f4fcc"),
"status" : {
"codigo" : "1",
"msg" : "Ativo"
},
"extra" : [
],
"tipo" : "amizade",
"vinculo" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d69a8eb0215c92942fd0983")
},
"vinculado" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d82d8fa7aebc42be1a378c2")
},
"createdAt" : ISODate("2019-10-09T09:51:16.984+0000"),
"updatedAt" : ISODate("2019-10-09T09:51:16.984+0000"),
"__v" : NumberInt(0)
}
// ----------------------------------------------
{
"_id" : ObjectId("5d9dad94f939957a905f4fcd"),
"status" : {
"codigo" : "2",
"msg" : "Solicitação pendente"
},
"extra" : [
],
"tipo" : "amizade",
"vinculo" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d82d8fa7aebc42be1a378c2")
},
"vinculado" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d69a8eb0215c92942fd0983")
},
"createdAt" : ISODate("2019-10-09T09:51:16.998+0000"),
"updatedAt" : ISODate("2019-10-09T09:51:16.998+0000"),
"__v" : NumberInt(0)
}
// ----------------------------------------------
{
"_id" : ObjectId("5d9dad96f939956a345f4fce"),
"status" : {
"codigo" : "1",
"msg" : "Ativo"
},
"extra" : [
],
"tipo" : "vacuo",
"vinculo" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d69a8eb0215c92942fd0983")
},
"vinculado" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d82d8fa7aebc42be1a378c2")
},
"createdAt" : ISODate("2019-10-09T09:51:18.587+0000"),
"updatedAt" : ISODate("2019-10-09T09:51:18.587+0000"),
"__v" : NumberInt(0)
}
// ----------------------------------------------
{
"_id" : ObjectId("5d9dce0cf939958be25f4fcf"),
"status" : {
"codigo" : "1",
"msg" : "Ativo"
},
"extra" : [
],
"tipo" : "amizade",
"vinculo" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d69a8eb0215c92942fd0983")
},
"vinculado" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d8354497aebc439a7a378d0")
},
"createdAt" : ISODate("2019-10-09T12:09:48.619+0000"),
"updatedAt" : ISODate("2019-10-09T12:09:48.619+0000"),
"__v" : NumberInt(0)
}
// ----------------------------------------------
{
"_id" : ObjectId("5d9dce0cf939958c4b5f4fd0"),
"status" : {
"codigo" : "2",
"msg" : "Solicitação pendente"
},
"extra" : [
],
"tipo" : "amizade",
"vinculo" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d8354497aebc439a7a378d0")
},
"vinculado" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d69a8eb0215c92942fd0983")
},
"createdAt" : ISODate("2019-10-09T12:09:48.635+0000"),
"updatedAt" : ISODate("2019-10-09T12:09:48.635+0000"),
"__v" : NumberInt(0)
}
// ----------------------------------------------
{
"_id" : ObjectId("5d9dce10f9399590a65f4fd1"),
"status" : {
"codigo" : "1",
"msg" : "Ativo"
},
"extra" : [
],
"tipo" : "amizade",
"vinculo" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d69a8eb0215c92942fd0983")
},
"vinculado" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d685f790215c983e4fd097e")
},
"createdAt" : ISODate("2019-10-09T12:09:52.994+0000"),
"updatedAt" : ISODate("2019-10-09T12:09:52.994+0000"),
"__v" : NumberInt(0)
}
// ----------------------------------------------
{
"_id" : ObjectId("5d9dce11f9399564715f4fd2"),
"status" : {
"codigo" : "2",
"msg" : "Solicitação pendente"
},
"extra" : [
],
"tipo" : "amizade",
"vinculo" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d685f790215c983e4fd097e")
},
"vinculado" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d69a8eb0215c92942fd0983")
},
"createdAt" : ISODate("2019-10-09T12:09:53.006+0000"),
"updatedAt" : ISODate("2019-10-09T12:09:53.006+0000"),
"__v" : NumberInt(0)
}
// ----------------------------------------------
{
"_id" : ObjectId("5d9e4afbde4e534ba8a1eb0f"),
"status" : {
"codigo" : "1",
"msg" : "Ativo"
},
"extra" : [
],
"tipo" : "nao-sugerir",
"vinculo" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d69a8eb0215c92942fd0983")
},
"vinculado" : {
"colecao" : "atletas",
"objeto" : ObjectId("5d80f31e7aebc412dea3789a")
},
"createdAt" : ISODate("2019-10-09T21:02:51.026+0000"),
"updatedAt" : ISODate("2019-10-09T21:02:51.026+0000"),
"__v" : NumberInt(0)
}
이 쿼리에서 올바른 값을 반환합니다(4개 항목).
db.getCollection("vinculos").aggregate(
[
{
"$match" : {
"status.codigo" : "1",
"tipo" : {
"$in" : [
"amizade",
"nao-sugerir"
]
},
"vinculo.objeto" : ObjectId("5d6821c70215c9e5e5fd096b")
}
}
]
)
하지만 저는 이 항목의 역이 필요합니다.
첫 번째 시도(결과 없음):
db.getCollection("vinculos").aggregate(
[
{
"$match" : {
"$nor" : [
{
"status.codigo" : "1"
},
{
"tipo" : {
"$in" : [
"amizade",
"nao-sugerir"
]
}
},
{
"vinculo.objeto" : ObjectId("5d6821c70215c9e5e5fd096b")
}
]
}
}
]
)
두 번째 시도(결과 없음):
db.getCollection("vinculos").aggregate(
[
{
"$match" : {
"$and" : [
{
"status.codigo" : {
"$ne" : "1"
}
},
{
"tipo" : {
"$nin" : [
"amizade",
"nao-sugerir"
]
}
},
{
"vinculo.objeto" : {
"$ne" : ObjectId("5d6821c70215c9e5e5fd096b")
}
}
]
}
}
]
)
다른 13개의 물건을 반품해야 하는데, 어떤 제안이 있습니까?
TLDR; NAND 게이트를 원하신다면...
db.getCollection('test').find({ $or: [ {institution_type:{$ne:'A'}}, {type:{$ne:'C'}} ]})
그리고 나서 이 대답에 감사하세요 (투표하세요) (제가 아니라)
아니면 NOR 게이트...
db.getCollection('test').find({ $nor: [{institution_type:'A', type:'C'}] })
긴 버전...
MongoDB에서 처리할 논리 연산자를 찾을 수 없습니다.$nand
논리를 "구축"했습니다(아래 참조).
에 대한 공개 기능 요청이 있습니다.$nand
운영자, 하지만 저는 숨을 참을 수 없습니다 (2014년 제작).
$nor
또한 당신이 원하는 것을 할 수 있습니다, 만약 당신이 뒤집는다면.$ne
( IMO - 우리가 을 사생화하는 - 지만마 IMO - 치오하는사다니 - 사다것합니용느역을직집껴처화럼생아그을행동가우리▁(다▁using▁(니▁the하▁-o▁inverse사▁like▁behaviourbut▁im'▁onlyo합▁it▁the▁weising▁feelsre▁bastard용)$not
행동, 그리고 그것을 무시.$and
가 있기 .)하지만 효과가 있기 때문에 틀리지 않습니다.)
db.getCollection('test').insertMany([
{ "institution_type" : "A", "type" : "C" },
{ "institution_type" : "A", "type" : "D" },
{ "institution_type" : "B", "type" : "C" },
{ "institution_type" : "B", "type" : "D" }
])
// "NAND gate": (NOT A) OR (NOT B) -> correct 3x results
db.getCollection('test').find({ $or: [ {institution_type:{$not:{$eq:'A'}}}, {type:{$not:{$eq:'C'}}} ]})
// or simpler...
db.getCollection('test').find({ $or: [ {institution_type:{$ne:'A'}}, {type:{$ne:'C'}} ]})
// or simpler still...
// "NOR gate": (NOT A) AND (NOT B) -> correct 3x results
db.getCollection('test').find({ $nor: [{institution_type:'A', type:'C'}] })
언급URL : https://stackoverflow.com/questions/24092984/mongodb-using-not-and-and-together
'programing' 카테고리의 다른 글
일부 경우에만 모델에 대한 장고 오버라이드 저장? (0) | 2023.07.13 |
---|---|
플라스크의 컨텍스트 스택의 목적은 무엇입니까? (0) | 2023.07.13 |
Apache POI를 사용하여 Excel 차트 생성 (0) | 2023.07.13 |
' 상태를 확인하기 위한 Oracle 빈 상태 (0) | 2023.07.13 |
'for' 루프 이니셜라이저에서 포인터를 역참조하면 분할 오류가 생성됩니다. (0) | 2023.07.13 |