Mongoid - 在嵌入式文档中同时满足两个查询条件?

Mongoid - two query conditions to both be met in an embedded doc?

我有两个模型

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

我想查询所有 user_tag 名为 "nyc" 且 user_tag "nyc" 的 like_count > 10 的用户。我尝试了以下方法:

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

从逻辑上讲,这是它应该做的,但不是我需要它做的。它 returns 用户拥有 user_tag "nyc" 并且拥有任何 user_tag like_count >= 10。我需要拥有 user_tag 的用户"nyc" user_tag "nyc" 的 like_count >= 10.

我该怎么做?我是 运行 mongoid 4.0.2.

也许你应该这样写:

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

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

你可以试试这个

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

实际上,您的查询不符合您要达到的目的。它转换为以下 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