Mongoid - 在嵌入式文档中都可以满足两个查询条件?

时间:2015-10-01 06:55:01

标签: ruby-on-rails mongodb mongoid

我有两个型号

class User
  include Mongoid::Document
  include Mongoid::Timestamps
  field :username
   embeds_many :user_tags
end

class UserTag
  include Mongoid::Document
  field :name
  field :like_count, :type => Integer, :default => 0
  embedded_in :user
end

我想查询具有名为" nyc"的user_tag的所有用户。以及user_tag" nyc"有一个like_count> 10.我尝试过以下方法:

users = User.where('user_tags.name' => "nyc").and('user_tags.like_count' => {'$gte' => 10 })

从逻辑上讲,这可以做它应该做的事情,但不是我需要做的事情。它返回具有user_tag" nyc"并且任何user_tag都有like_count> = 10.我需要拥有user_tag" nyc" user_tag" nyc"的like_count是> = 10。

我该怎么做?我正在运行mongoid 4.0.2。

3 个答案:

答案 0 :(得分:1)

实际上,您的查询对于您尝试实现的目的而言是不正确的。它转换为以下MongoDB查询:

db.users.find({'user_tags.name': 'nyc' }, {'user_tags.like_count': {$gte: 10}})

这意味着MongoDB将找到具有这两个标准的所有文档。 Mongoid正在返回与MongoDB相同的数据。

您需要的是以下MongoDB查询:

db.users.find({ user_tags: {
  $elemMatch: {
    name: 'nyc',
    like_count: { $gte: 10  }
  }
}})

使用Mongoid你可以写:

User.where(user_tags: {
  '$elemMatch' => {
    name: 'nyc',
    like_count: { '$gte' => 10 }
  }
}).count

答案 1 :(得分:0)

也许你应该这样写:

users = User.where('user_tags.name' => "nyc", 'user_tags.like_count' => {'$gte' => 10 })

Mongoid将尝试查找满足这两个条件的文档。

答案 2 :(得分:0)

你可以试试这个

users = User.where('user_tags.name' => "nyc").where('user_tags.like_count' => {'$gte' => 10 }).all

users = User.where('user_tags.name' => "nyc", 'user_tags.like_count' => {'$gte' => 10 }).all