Ruby on rails Mongoid使用数组字段进行查找,数组中没有任何顺序
我有以下记录:Ruby on rails Mongoid使用数组字段进行查找,数组中没有任何顺序,ruby-on-rails,mongodb,mongoid,Ruby On Rails,Mongodb,Mongoid,我有以下记录: { "_id" : ObjectId("54bcc86320db902902000c13"), "latest_activity_at" : ISODate("2015-01-19T09:10:40.000Z"), "members" : [ "54ad458b20db9004e903ac02", "54ad1d9320db9004e90348b2" ], "kid_id" : ObjectId("54a
{
"_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"
}
我试图用以下方法找到记录:
模型
看法
但我只得到一条记录,我想查找所有记录,无论数组字段中的顺序如何。MongoDB将在数组字段中搜索您的记录,因此您想说: 其中
成员
是当前的孩子id.to
,成员
是k.id.to
您尝试构建的基础查询是:
db.kid_conversations.find({
$and: [
{ members: "54ad458b20db9004e903ac02" },
{ members: "54ad1d9320db9004e90348b2" }
]
})
您想在两个子句中使用all_of
:
KidConversation.all_of(
{ members: member.to_s },
{ members: member2.to_s }
)
或者使用where
自己构建$和:
KidConversation.where(:$and => [
{ :members => member.to_s },
{ :members => member2.to_s }
])
您还可以使用:
$all
运算符选择字段值为包含所有指定元素的数组的文档
感谢您的提醒。在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时结果相同,因此请使用对您有意义的版本。为什么不使用?考虑到这是参数中的同一字段。这比每次都给同一个字段命名要简洁得多。
db.kid_conversations.find({
members: {
$all: [
"54ad458b20db9004e903ac02",
"54ad1d9320db9004e90348b2"
]
}
})
KidConversation.where(:members.all => [ member, member2 ].map(&:to_s))
KidConversation.all(:members => [ member, member2 ].map(&:to_s))