У мене є дві моделі
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" і де у тегу користувача "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" "s_count_count>> = 10.
Як це зробити? Я запускаю монгоїд 4.0.2.
Відповіді:
1 для відповіді № 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
0 для відповіді № 2
Можливо, вам слід написати щось подібне:
users = User.where("user_tags.name" => "nyc", "user_tags.like_count" => {"$gte" => 10 })
Mongoid спробує знайти документи, які відповідають обом умовам.
0 для відповіді № 3
Ви можете спробувати це
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