2011-11-23 86 views
1

我在MongoDB數據庫的RoR上有一些應用。我使用Mongoid映射器。型號post.rbMongoid查詢

class Post 
    include Mongoid::Document 

    field :title, :type => String 
    field :text, :type => String 

    embeds_many :comments 
end 

型號comment.rb

class Comment 
    include Mongoid::Document 

    field :name, :type => String 
    field :content, :type => String 

    embedded_in :post, :inverse_of => :comments 
end 

在數據庫這篇文章的一些評論有一個結構:

{ 
    "_id": ObjectId("4ecbeacf65430f0cef000003"), 
    "comments": { 
    "0": { 
     "name": "my name", 
     "content": "example content", 
     "_id": ObjectId("4ecbead365430f0cef000005") 
    }, 
    "1": { 
     "name": "some name", 
     "content": "example content", 
     "_id": ObjectId("4ecbead665430f0cef000007") 
    }, 
    "2": { 
     "name": "some name", 
     "content": "example content", 
     "_id": ObjectId("4ecbeada65430f0cef000009") 
    } 
    }, 
    "text": "example text", 
    "title": "example title" 
} 

而且,例如,在數據庫與幾個職位我的意見。 我需要找到所有帖子,其中"name": "my name",即我需要找到所有可編輯的帖子。

+0

你的評論對象不應該是對象的數組嗎?不是具有任意名稱的子對象的對象?我會重新看看你的架構體系結構。 – Petrogad

回答

3

它應該顯示爲一個註釋數組而不是散列。看我下面的例子。

此外,根據mongoid文檔使用新樣式字段聲明。

comment.rb:

class Comment 
    include Mongoid::Document 

    field :name, type: String 
    field :content, type: String 

    embedded_in :post 
end 

post.rb:

class Post 
    include Mongoid::Document 

    field :title, type: String 
    field :text, type: String 

    embeds_many :comments 
end 

滑軌控制檯:

p = Post.new(:title => "title", :text => "post") 
c1 = Comment.new(:name => "Tyler", :comment => "Awesome Comment!") 
c2 = Comment.new(:name => "Joe", :comment => "comment 2") 
p.comments << c1 
p.comments << c2 
p.save 

蒙戈控制檯:

> db.posts.findOne() 
{ 
    "_id" : ObjectId("4ecd151d096f762149000001"), 
"title" : "title", 
"text" : "post body", 
"comments" : [ 
      { 
     "name" : "Tyler", 
     "comment" : "Awesome Comment!", 
     "_id" : ObjectId("4ecd1569096f762149000002") 
    }, 
    { 
     "name" : "Joe", 
     "comment" : "comment 2", 
     "_id" : ObjectId("4ecd157f096f762149000003") 
    } 
]} 

然後,做你想做的查詢,我認爲這是「發表的評論通過我嗎?」:

> db.posts.findOne({"comments.name": "Tyler"}) 

另外,我想一個索引添加到comments.name領域:

> db.posts.ensureIndex({"comments.name": 1}) 
+0

我做了你寫的,但數據庫結構不變。 – Eugene

+0

最新的導軌和mongoid? –

+0

rails 3.1.1,mongoid 2.3.4 – Eugene