Монгоидные запросы - PullRequest
       5

Монгоидные запросы

1 голос
/ 23 ноября 2011

У меня есть приложение на RoR с базой данных Mongodb. Я использую Mongoid Mapper. Модель post.rb

class Post
  include Mongoid::Document

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

  embeds_many :comments
end

Комментарий модели. 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", т.е. мне нужно найти все редактируемые мной сообщения.

1 Ответ

3 голосов
/ 23 ноября 2011

Он должен отображаться в виде массива комментариев вместо хеша.См. Мой пример ниже.

Также, согласно документам 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

Консоль Rails:

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

Консоль Mongo:

> 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})
...