programing

DBRef로 mongodb를 쿼리하는 방법

minecode 2021. 1. 14. 08:09
반응형

DBRef로 mongodb를 쿼리하는 방법


다음 데이터 구조가 있다고 가정합니다.

var user = {_id: 'foo', age: 35};
var post = {_id: '...', author: {$ref: user, $id: 'foo'},...};

user [foo]를 참조하는 모든 게시물을 쿼리하려면 어떻게해야합니까? 다음을 시도했지만 작동하지 않습니다.

db.post.find('author._id': 'foo');
var u = db.user.find({_id: 'foo'});
db.post.find('author': u);

공식 문서와 Google에서도 답을 찾을 수 없습니다!

누구나 아이디어가 있습니까?


알았다:

db.post.find({'author.$id': 'foo'})

. $ id 참조를 사용할 수 있지만 해당 필드의 모든 인덱스는 무시됩니다. 터미널을 통해 직접 쿼리하거나 무언가를 빨리 찾고 싶지 않다면 그 방법을 무시하는 것이 좋습니다. 대규모 컬렉션을 사용하는 경우 필드를 인덱싱하고 아래 방법을 사용하여 쿼리 할 수 ​​있습니다.

다음을 사용하여 인덱스 쿼리를 사용하려는 경우 :

db.post.find('author' : { "$ref" : 'user', "$id" : 'foo' , "$db" :'database_name' })

foo가 객체 ID 인 경우

db.post.find('author' : { "$ref" : 'user', "$id" : ObjectId('foo') , "$db" :'database_name' })

작성자에 대한 색인을 만들 수 있습니다.

db.post.ensureIndex( {'author' : 1 } );

이것은 db.post.find('author.$id': 'foo')누락 {}되었으므로 올바른 문장은 다음과 같습니다.

db.post.find({'author.$id': 'foo'})

또한 다음을 통해 달성 할 수 있습니다.

db.post.find({'author': DBRef("user", ObjectId('foo'))})

그러나 첫 번째 방법은 더 작고 실용적입니다.


이것에 대한 Java 솔루션을 찾는 사람이라면 mongojack을 사용하는 경우 정말 쉽습니다.

collection.find(DBQuery.is("user", new DBRef(user.getId(), User.class)));

컬렉션은 JacksonDBCollection입니다.


mongoengine에서는 참조 된 객체의 인스턴스를 사용해야합니다. ID가 설정되어 있어야합니다. 작성자가 작성자 문서 인스턴스라고 가정하십시오. 그래서 이것을 사용하십시오.

Post.objects(author__eq=author)

이 저자의 모든 게시물을 살펴볼 수 있습니다. Post.author는 ReferenceField로 정의되어야합니다.


Mongo 2.4.1 버전 사용

이것은 OLA 수집을 위해 명령 줄에서 수행하는 방법입니다. @DBRef dbrefName

db.OLA.find({"dbrefName.someFieldValue" : "Personal"});

정확한 쿼리

db.OLA.find({"dbrefName.$id" : ObjectId("1234")});

참조 URL : https://stackoverflow.com/questions/6195286/how-to-query-mongodb-with-dbref

반응형