[MONGODB] 명시 적으로 이름을 지정하지 않고 MongoDB의에서 모든 필드의 값을 검색
MONGODB명시 적으로 이름을 지정하지 않고 MongoDB의에서 모든 필드의 값을 검색
나는 MongoDB의 문서를 보면서이 질문을 봤지만 정말 적절한 해답을 찾을 수 없습니다. 그래서, 여기에 내가 무엇을 찾고있다. 나는이 같은 요소의 컬렉션이 가정 :
{
"foo" : "bar",
"test" : "test",
"key" : "value",
}
내가 달성하고자하는 필드 (아마도 ;-) 유한 한 많은 제외) 모두 검색하여 요소를 찾을 수 있습니다. 즉 : 쿼리 감안할 때, 나는 쿼리가 발견되어야하는 분야에서 모른다.
이런 내 생각 뭔가
db.things.find({_ANY_ : "bar"})
나에게 예제 요소를 줄 것이다.
도와 주셔서 감사 해요.
해결법
-
==============================
1.모든 필드에서 텍스트 검색을 수행하려면 먼저 모든 필드에 텍스트 인덱스를 작성해야합니다.
모든 필드에서 텍스트 검색을 수행하려면 먼저 모든 필드에 텍스트 인덱스를 작성해야합니다.
MongoDB를 문서 알 수 있듯이, "문자열의 내용을 포함하는 모든 필드 인덱스에 와일드 카드 지정자 ($ **)를 사용, 문자열 내용으로 모든 필드에 텍스트 검색을 허용합니다."
당신이 몽고 쉘 내부에서 작업하는 경우 다음 '컬렉션'사용하려는 DB에서 컬렉션의 이름이 명령으로 작업을 수행 할 수 있습니다, (당신은 '몽고'호출하여 명령 줄에서 실행된다).
db.collection.createIndex ({ "$ **": "텍스트"}, {이름 : "TextIndex"})
두 번째 목적은, 즉 {이름 : "TextIndex은"}, 선택 사항입니다 ... 한 번에 모음 당 하나의 텍스트 인덱스 (이있을 수 있기 때문에 실제로 인덱스에 이름을 부여 할 필요가 없습니다 ... 당신을 ) 인덱스를 삭제하고 원하는 경우 새로 만들 수 있습니다.
모든 필드에 텍스트 인덱스를 만든 후에는 다음 쿼리 개체 간단한 텍스트 검색을 수행 할 수 있습니다 {$ 텍스트 : {$ 검색 : <당신의 문자열>}}
당신은 자바 스크립트 기능을 작성하는 경우 그래서, 당신이 뭔가를 같이 할 수 있습니다 :
var에 커서 = db.collection (
) 발견 ({$ 텍스트 : {$ 검색 : <당신의 문자열>}}).; 검색을 제어 할 수있는 다양한 방법에 대한 자세한 정보를 원하시면, 여기에 텍스트 검색에 MongoDB의 설명서를 참조하십시오
-
==============================
2.비슷한 질문이 대답은 내가 완성도 여기를 반복합니다 솔루션을 가지고 있습니다. 이 쿼리의 거의 모든 다른 종류보다 훨씬 느릴 것이라는 경고와 함께, 운영자가 MongoDB를 서버 (들)에 임의의 자바 스크립트를 실행하는 곳 $를 사용할 수 있습니다. 귀하의 예를 들어, 다음과 같습니다
비슷한 질문이 대답은 내가 완성도 여기를 반복합니다 솔루션을 가지고 있습니다. 이 쿼리의 거의 모든 다른 종류보다 훨씬 느릴 것이라는 경고와 함께, 운영자가 MongoDB를 서버 (들)에 임의의 자바 스크립트를 실행하는 곳 $를 사용할 수 있습니다. 귀하의 예를 들어, 다음과 같습니다
db.things.find({$where: function() { for (var key in this) { if (this[key] === "bar") { return true; } } return false; }});
-
==============================
3.이 개별적으로 검사 문서 응용 프로그램 측없이 또는 서버 측 코드의 실행을 통해 수 없습니다. 에 스키마를 변경하는 것이 좋습니다 :
이 개별적으로 검사 문서 응용 프로그램 측없이 또는 서버 측 코드의 실행을 통해 수 없습니다. 에 스키마를 변경하는 것이 좋습니다 :
{params:[{field:"foo", value:"bar"}, {field:"test", value:"test"}, {field:"key", value:"value"}]}
이것은 분명히 (주로 성능과 poluted 스키마) 몇 가지 단점을 가지고 있지만 통해 필요한 수 있습니다 :
db.things.find({'params.value':"bar"})
-
==============================
4.슬프게도, 이전 답변을 아무도 몽고는 배열이나 중첩 된 객체에 중첩 된 값을 포함 할 수 있다는 사실을 해결합니다.
슬프게도, 이전 답변을 아무도 몽고는 배열이나 중첩 된 객체에 중첩 된 값을 포함 할 수 있다는 사실을 해결합니다.
이는 올바른 QUERY입니다
{$where: function() { var deepIterate = function (obj, value) { for (var field in obj) { if (obj[field] == value){ return true; } var found = false; if ( typeof obj[field] === 'object') { found = deepIterate(obj[field], value) if (found) { return true; } } } return false; }; return deepIterate(this, "573c79aef4ef4b9a9523028f") }}
질의는 모든 중첩 요소에 반복되며, 값과 키가 발견 될 때까지 모든 것을 반복하는 수단이 '물체'를 반환 배열 또는 중첩 된 객체에 대해서 typeof 전화입니다.
당신은 중첩 된 값으로 이전 답변을 확인하실 수 있습니다 원하는에서 결과까지 될 것입니다.
전체 개체를 Stringifying 것은 그들을 일치하려고 한 모든 메모리 섹터의 하나를 통해이 반복이 있기 때문에 훨씬 적은 확대됨입니다. 그리고 램 메모리에 문자열로 객체의 복사본 (더 많은 RAM과 기능 컨텍스트가 이미로드 된 객체를 가지고 있기 때문에 느린 쿼리 사용하기 때문에 모두 비효율적)을 만듭니다
-
==============================
5.당신은 재귀 함수와 함께 할 수 있습니다 :
당신은 재귀 함수와 함께 할 수 있습니다 :
var recursiveSearch = function(query) { db.test_insert.find().forEach(function(items) { var i = 0; var recursiveFunc = function(itemsArray, itemKey) { var itemValue = itemsArray[itemKey]; if(itemValue === query) { printjson(items); } if(typeof itemValue === "object") { Object.keys(itemValue).forEach(function(itemValueKey) { recursiveFunc(itemValue, itemValueKey); }); } }; Object.keys(items).forEach(function(item){ recursiveFunc(items, item); }); }); }; recursiveSearch('your string');
-
==============================
6.전체 테이블 스캔을 수행과 동일하며 인덱스를 사용할 수 없습니다 $를 사용. 나는 또한 그러나 나는이 일을 찾았어요, 작업 가져올 수 없습니다 (그것도 전체 테이블 스캔에 해당 않습니다)
전체 테이블 스캔을 수행과 동일하며 인덱스를 사용할 수 없습니다 $를 사용. 나는 또한 그러나 나는이 일을 찾았어요, 작업 가져올 수 없습니다 (그것도 전체 테이블 스캔에 해당 않습니다)
db.collection.find().forEach(function(doc){ for (var key in doc) { if ( /needle/.test(doc[key]) ) printjson(doc); } });
여기서 / 니들 / 문서의 값을 찾을 수있는 정규 표현식은 [키]
-
==============================
7.텍스트 검색을 수행하려면, 당신은 당신의 컬렉션에 대한 텍스트 인덱스를 생성해야합니다. 인덱스 텍스트 : 자세한 내용은, 몽고 문서에서보기를 위해
텍스트 검색을 수행하려면, 당신은 당신의 컬렉션에 대한 텍스트 인덱스를 생성해야합니다. 인덱스 텍스트 : 자세한 내용은, 몽고 문서에서보기를 위해
-
==============================
8.
{ "foo" : "bar", "test" : "test", "key" : "value", } db.collection_name.find({'foo':"bar"})
from https://stackoverflow.com/questions/6790819/searching-for-value-of-any-field-in-mongodb-without-explicitly-naming-it by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB의 쿼리에 주어진 키를 가진 레코드를 선택 (0) | 2019.12.08 |
---|---|
[MONGODB] MongoDB의 서버를 시작할 수 없습니다 : 기본 스토리지 엔진 'wiredTiger은'mongod의이 빌드에 사용할 수 없습니다 (0) | 2019.12.07 |
[MONGODB] MongoDB를 문서의 N 번호를 삭제하는 방법 (0) | 2019.12.07 |
[MONGODB] 몽구스 / MongoDB의 쿼리는 조인 ..하지만 난 SQL 배경에서 온 (0) | 2019.12.07 |
[MONGODB] 리눅스에서 MongoDB를 얻기 원격 연결을 청취하기 (0) | 2019.12.07 |