How to query mongodb with DBRef

后端 未结 6 1805
时光说笑
时光说笑 2020-11-30 22:10

suppose I have the following datastructure:

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

相关标签:
6条回答
  • 2020-11-30 22:44

    Got it:

    db.post.find({'author.$id': 'foo'})
    
    0 讨论(0)
  • 2020-11-30 22:46

    In mongoengine you should just use the instance of the referenced object. It should have the ID set. Suppose the author is the Author document instance. So using this:

    Post.objects(author__eq=author)
    

    you can go through all posts of this author. Post.author should be defined as ReferenceField

    0 讨论(0)
  • 2020-11-30 22:52

    You can use the .$id reference but it will ignore any indexes on those fields. I would suggest ignoring that method unless you are querying it directly via the terminal or want to look up something quickly. In using large collections you will want to index the field and query it using the below method.

    If you want to use an index query using the following:

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

    If foo is an object id

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

    You can create an index on author by

    db.post.ensureIndex( {'author' : 1 } );
    
    0 讨论(0)
  • Using Mongo 2.4.1 version

    This is how you do it on command line for OLA collection where @DBRef dbrefName

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

    Exact query

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

    0 讨论(0)
  • 2020-11-30 23:08

    This db.post.find('author.$id': 'foo') has missing the {}, so the correct sentence is:

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

    Also this can be achieved with:

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

    But is more compact and practical the first way.

    0 讨论(0)
  • 2020-11-30 23:08

    For anyone looking for a Java solution to this then if you are using mongojack its really easy:

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

    Where collection is a JacksonDBCollection.

    0 讨论(0)
提交回复
热议问题