Arrays 在集合中设置输入数组和数组列之间的交集
我有一个用户将输入的数组,我想对照集合中的每个文档进行检查。每个文档都有一个名为“members”的列,该列有自己的数组。我想让mongo循环遍历每一列并进行setIntersection以查看这两个数组的相似性,然后将结果返回给我,这样我就可以向用户显示哪些文档最接近它们的输入。到目前为止,在平蒙戈,我在遇到路障之前已经完成了这个命令Arrays 在集合中设置输入数组和数组列之间的交集,arrays,mongodb,pymongo,Arrays,Mongodb,Pymongo,我有一个用户将输入的数组,我想对照集合中的每个文档进行检查。每个文档都有一个名为“members”的列,该列有自己的数组。我想让mongo循环遍历每一列并进行setIntersection以查看这两个数组的相似性,然后将结果返回给我,这样我就可以向用户显示哪些文档最接近它们的输入。到目前为止,在平蒙戈,我在遇到路障之前已经完成了这个命令 list(collection.aggregate([{"$project":{"members":1,'id':1}}, {"$match":{"member
list(collection.aggregate([{"$project":{"members":1,'id':1}},
{"$match":{"members":["FOXF1","GATA6","SOX9","TWIST1","ZEB1","ZEB2"]}}]))
此命令遍历每个文档的“成员”列,并将与查询完全匹配的id和成员返回给我:
"members":["FOXF1","GATA6","SOX9","TWIST1","ZEB1","ZEB2"]
我想更进一步,但我不确定如何开始处理不仅是执行setIntersection,而且同时在每个文档上执行它
文档显示了一个比较2个阵列的简单示例
commonToBoth: { db.experiments.aggregate([
{ $project: { A: 1, B: 1, commonToBoth: { $setIntersection: [ "$A", "$B" ] }, _id: 0 } }])
我希望第二个数组在每个文档的“成员”列中循环。所以我可以一次完成所有文档的setIntersection,我不确定从哪里开始
还有一件事我不确定pymongo的setIntersection语法。例如,mongo使用findOne,而pymongo使用find\u one
。我发现setIntersection的情况并非如此。$set\u intersection
和$setIntersection
都不起作用,而且我还没有在pymongo在线找到任何关于如何设置交叉点的文档。感谢您的阅读和帮助。请尝试以下内容:
inputArray = ["FOXF1", "GATA6", "SOX9", "TWIST1", "ZEB1", "ZEB2"]
list(collection.aggregate([{ "$match": { "members": { $in: inputArray } } },
{
$project: {
matchingCount: { $size: { $setIntersection: ['$members', inputArray] } }
, matchingMembers: { $setIntersection: ['$members', inputArray] }
}
}, { $sort: { 'matchingCount': -1 } }]))
如果您有一个id
字段,那么您可以在$project
中执行id:1
和\u id:0
。由于您有一个$match
,此输出将只包含从inputArray到members数组中至少有一个匹配元素的文档,如果要检查集合中所有文档的匹配率,只需删除该筛选器,但最好将match作为第一阶段,因为通过减少后期阶段的文档总数,DB操作得到了极大的优化
示例文档:
/* 1 */
{
"_id" : ObjectId("5dd859f93d319574a17e9be9"),
"members" : [
"FOXF1",
"GATA6",
"SOX9",
"TWIST1",
"ZEB1",
"ZEB2"
]
}
/* 2 */
{
"_id" : ObjectId("5dd85a053d319574a17e9e0c"),
"members" : [
"FOXF11",
"GATA61",
"SOX91",
"TWIST11",
"ZEB11",
"ZEB21"
]
}
/* 3 */
{
"_id" : ObjectId("5dd85a0f3d319574a17ea02a"),
"members" : [
"FOXF1"
]
}
/* 4 */
{
"_id" : ObjectId("5dd85a1a3d319574a17ea29d"),
"members" : [
"FOXF1",
"ZEB2"
]
}
/* 5 */
{
"_id" : ObjectId("5dd85a263d319574a17ea4fa"),
"members" : [
"FOXF1",
"GATA61",
"SOX91",
"TWIST11",
"ZEB1",
"ZEB2"
]
}
/* 6 */
{
"_id" : ObjectId("5dd85a343d319574a17ea79c"),
"members" : [
"FOXF1",
"GATA6",
"SOX9"
]
}
/* 7 */
{
"_id" : ObjectId("5dd85a433d319574a17eaa4b"),
"members" : [
"FOXF1",
"GATA6",
"SOX9",
"TWIST1"
]
}
/* 8 */
{
"_id" : ObjectId("5dd85a4d3d319574a17eab7a"),
"members" : []
}
/* 9 */
{
"_id" : ObjectId("5dd85a573d319574a17eac89"),
"members1" : ""
}
/* 1 */
{
"_id" : ObjectId("5dd859f93d319574a17e9be9"),
"matchingCount" : 6,
"matchingMembers" : [
"FOXF1",
"GATA6",
"SOX9",
"TWIST1",
"ZEB1",
"ZEB2"
]
}
/* 2 */
{
"_id" : ObjectId("5dd85a433d319574a17eaa4b"),
"matchingCount" : 4,
"matchingMembers" : [
"FOXF1",
"GATA6",
"SOX9",
"TWIST1"
]
}
/* 3 */
{
"_id" : ObjectId("5dd85a263d319574a17ea4fa"),
"matchingCount" : 3,
"matchingMembers" : [
"FOXF1",
"ZEB1",
"ZEB2"
]
}
/* 4 */
{
"_id" : ObjectId("5dd85a343d319574a17ea79c"),
"matchingCount" : 3,
"matchingMembers" : [
"FOXF1",
"GATA6",
"SOX9"
]
}
/* 5 */
{
"_id" : ObjectId("5dd85a1a3d319574a17ea29d"),
"matchingCount" : 2,
"matchingMembers" : [
"FOXF1",
"ZEB2"
]
}
/* 6 */
{
"_id" : ObjectId("5dd85a0f3d319574a17ea02a"),
"matchingCount" : 1,
"matchingMembers" : [
"FOXF1"
]
}
输出:
/* 1 */
{
"_id" : ObjectId("5dd859f93d319574a17e9be9"),
"members" : [
"FOXF1",
"GATA6",
"SOX9",
"TWIST1",
"ZEB1",
"ZEB2"
]
}
/* 2 */
{
"_id" : ObjectId("5dd85a053d319574a17e9e0c"),
"members" : [
"FOXF11",
"GATA61",
"SOX91",
"TWIST11",
"ZEB11",
"ZEB21"
]
}
/* 3 */
{
"_id" : ObjectId("5dd85a0f3d319574a17ea02a"),
"members" : [
"FOXF1"
]
}
/* 4 */
{
"_id" : ObjectId("5dd85a1a3d319574a17ea29d"),
"members" : [
"FOXF1",
"ZEB2"
]
}
/* 5 */
{
"_id" : ObjectId("5dd85a263d319574a17ea4fa"),
"members" : [
"FOXF1",
"GATA61",
"SOX91",
"TWIST11",
"ZEB1",
"ZEB2"
]
}
/* 6 */
{
"_id" : ObjectId("5dd85a343d319574a17ea79c"),
"members" : [
"FOXF1",
"GATA6",
"SOX9"
]
}
/* 7 */
{
"_id" : ObjectId("5dd85a433d319574a17eaa4b"),
"members" : [
"FOXF1",
"GATA6",
"SOX9",
"TWIST1"
]
}
/* 8 */
{
"_id" : ObjectId("5dd85a4d3d319574a17eab7a"),
"members" : []
}
/* 9 */
{
"_id" : ObjectId("5dd85a573d319574a17eac89"),
"members1" : ""
}
/* 1 */
{
"_id" : ObjectId("5dd859f93d319574a17e9be9"),
"matchingCount" : 6,
"matchingMembers" : [
"FOXF1",
"GATA6",
"SOX9",
"TWIST1",
"ZEB1",
"ZEB2"
]
}
/* 2 */
{
"_id" : ObjectId("5dd85a433d319574a17eaa4b"),
"matchingCount" : 4,
"matchingMembers" : [
"FOXF1",
"GATA6",
"SOX9",
"TWIST1"
]
}
/* 3 */
{
"_id" : ObjectId("5dd85a263d319574a17ea4fa"),
"matchingCount" : 3,
"matchingMembers" : [
"FOXF1",
"ZEB1",
"ZEB2"
]
}
/* 4 */
{
"_id" : ObjectId("5dd85a343d319574a17ea79c"),
"matchingCount" : 3,
"matchingMembers" : [
"FOXF1",
"GATA6",
"SOX9"
]
}
/* 5 */
{
"_id" : ObjectId("5dd85a1a3d319574a17ea29d"),
"matchingCount" : 2,
"matchingMembers" : [
"FOXF1",
"ZEB2"
]
}
/* 6 */
{
"_id" : ObjectId("5dd85a0f3d319574a17ea02a"),
"matchingCount" : 1,
"matchingMembers" : [
"FOXF1"
]
}
这个问题完美地解决了问题,完全符合我的要求。非常感谢你。