我有以下记录:
{
"_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)
但我只得到一条记录,我想找到所有记录,无论数组字段内的顺序如何。
答案 0 :(得分:1)
MongoDB会在你的数组字段中搜索,所以你想说:
其中
members
为current_kid.id.to_s
而members
为k.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时最终都是一样的,所以请使用对你有意义的版本。