Mongoid使用数组字段查找数组内没有任何顺序

时间:2015-01-19 09:31:25

标签: ruby-on-rails mongodb mongoid

我有以下记录:

{
    "_id" : ObjectId("54bcc86320db902902000c13"),
    "latest_activity_at" : ISODate("2015-01-19T09:10:40.000Z"),
    "members" : [ 
        "54ad458b20db9004e903ac02", 
        "54ad1d9320db9004e90348b2"
    ],
    "kid_id" : ObjectId("54ad1d9320db9004e90348b2"),
    "updated_at" : ISODate("2015-01-19T09:10:40.000Z"),
    "created_at" : ISODate("2015-01-19T09:03:31.000Z"),
    "token" : "cvq1t-Ml7HLmzQo3mDMdiA"
}

{
    "_id" : ObjectId("54bcca7b20db902902000e28"),
    "latest_activity_at" : ISODate("2015-01-19T09:12:27.000Z"),
    "members" : [ 
        "54ad1d9320db9004e90348b2", 
        "54ad458b20db9004e903ac02"
    ],
    "kid_id" : ObjectId("54ad458b20db9004e903ac02"),
    "updated_at" : ISODate("2015-01-19T09:12:27.000Z"),
    "created_at" : ISODate("2015-01-19T09:12:27.000Z"),
    "token" : "H4Sv2yqXSpdGIsKlD7zsRg"
}

我正在尝试使用以下方法找到记录:

模型

 def message_between_users(member, member2)
        conversation = KidConversation.any_of(members: [member.to_s, member2.to_s] )
        conversation.count
      end

视图

= current_kid.message_between_users(current_kid.id.to_s, k.id.to_s)

但我只得到一条记录,我想找到所有记录,无论数组字段内的顺序如何。

1 个答案:

答案 0 :(得分:1)

MongoDB会在你的数组字段中搜索,所以你想说:

  

其中memberscurrent_kid.id.to_smembersk.id.to_s

您尝试构建的基础查询是:

db.kid_conversations.find({
  $and: [
    { members: "54ad458b20db9004e903ac02" },
    { members: "54ad1d9320db9004e90348b2" }
  ]
})

您希望将all_of与两个子句一起使用:

KidConversation.all_of(
  { members: member.to_s },
  { members: member2.to_s }
)

或使用$and自己构建where

KidConversation.where(:$and => [
  { :members => member.to_s  },
  { :members => member2.to_s }
])

您也可以使用$all

  

$all运算符选择字段值为包含所有指定元素的数组的文档。

感谢Neil Lunn提醒您。在MongoDB术语中,您可以:

db.kid_conversations.find({
  members: {
    $all: [
      "54ad458b20db9004e903ac02",
      "54ad1d9320db9004e90348b2"
    ]
  }
})

这转换为Mongoid中的其中一个:

KidConversation.where(:members.all => [ member, member2 ].map(&:to_s))
KidConversation.all(:members => [ member, member2 ].map(&:to_s))

这两个Mongoid查询在到达MongoDB时最终都是一样的,所以请使用对你有意义的版本。