0

这完全是关于在 Rails 应用程序中使用的has_and_belongs_to_many关系和查询。mongodbmongid3

我有class Aclass B说:

class A
  include Mongoid::Document
  has_and_belongs_to_many :bs
end

class B
  include Mongoid::Document
  has_and_belongs_to_many :as
end

现在实例化 3 a-s 和 3 b-s:

a1 = A.create()
a2 = A.create()
a3 = A.create()

b1 = B.create()
b2 = B.create()
b3 = B.create()

现在一个接一个地引用它们,例如:

a1.bs.push([b1, b3])
a2.bs.push([b2, b3])
a3.bs.push(b2)

所以:

b1.as.all
 => [<#A _id: 1000000000000001>] # i.e. a1

b2.as.all
 => [<#A _id: 1000000000000002>, <#A _id: 1000000000000003>] # i.e. a2, a3

b3.as.all
 => [<#A _id: 1000000000000001>, <#A _id: 1000000000000002>] # i.e. a1, a2

a-s类似:

a1.bs.all
 => [<#B _id: 2000000000000001>, <#B _id: 2000000000000003>] # i.e. b1, b3

a2.bs.all
 => [<#B _id: 2000000000000002>, <#B _id: 2000000000000003>] # i.e. b2, b3

a3.bs.all
 => [<#B _id: 2000000000000002>] # i.e. b2

现在我想得到那些a有-s的b-s,有

  • a3:

    • a1 有 b1, b3 有: [[a1],[a1, a2]] => [a1, a2] => 不包括 a1
    • a2 有 b2, b3 有: [[a2, a3],[a1, a2]] => [a1, a2, a3] => 包括 a2
    • a3 有 b2,其中有 [[a2, a3]] => [a2, a3] => 包括 a3

      => [a2, a3] => [<#A _id: 1000000000000002>, <#A _id: 1000000000000003>]

  • a1和a2:

    • a1 有 b1, b3 有: [[a1],[a1, a2]] => [a1, a2] => 包括 a1
    • a2 有 b2, b3 有: [[a2, a3],[a1, a2]] => [a1, a2, a3] => 包括 a2
    • a3 有 b2,其中有 [[a2, a3]] => [a2, a3] => 不包括 a3

      => [a1, a2] => [<#A _id: 1000000000000001>, <#A _id: 1000000000000002>]

  • 不包括 a1

    • a1 有 b1, b3 有: [[a1],[a1, a2]] => [a1, a2] => 包括 a1
    • a2 有 b2, b3 有: [[a2, a3],[a1, a2]] => [a1, a2, a3] => 包括 a2
    • a3 有 b2,其中有 [[a2, a3]] => [a2, a3] => 不包括 a3

      => [a3] => [<#A _id: 1000000000000003>]

  • 等等

我认为这很容易:

 A.all.where("b.id" => a1._id).count
  => 0

或者

 A.all.where(:"bs.id" => a1._id).count
  => 0

或者

 A.all.where(:"b.id" => "1000000000000003").count
  => 0

但是没有...

TLDP:如何找到具有所需文档集合的文档?(比如说多级查询)?

4

1 回答 1

1

查找 HasMany(或 HABTM)关系是否与另一方(belongs_to 或 HABTM)有关系的查询是:

A.in(b_ids: [b1.id])
# return criteria for : All A's that b_ids has b1.id

它也可以这样工作:

A.where(:b_ids.in => [b1.id])

如果要查询多个数组项,则必须使用 mongodb$all运算符:

A.where(:b_ids.all [b1.id,b2.id])
# return criteria for : All A's that b_ids has b1.id and b2.id

Mongoid/Origin.Selection 文档

MongoDB $in 运算符

MongoDB $all 运算符

于 2013-10-18T13:30:35.930 回答