我有两个型号
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。
答案 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