gpt4 book ai didi

javascript - 如何将文档与 Mongodb 中对象属性的值进行匹配

转载 作者:行者123 更新时间:2023-11-28 19:05:46 25 4
gpt4 key购买 nike

我正在尝试匹配 mongoDB 中的某些文档:

我的文档模型:

profile: {
languages: [
{"name": "French", "level": 1},
{"name": "English", "level": 2},
{"name": "Spanish", "level": 4}
]
}

我(可以)必须搜索我的结果集:

lang = ["French", "English"];
objLang = [
{name: "French"},
{name: "English"}
];

我需要的是 db.find() 与至少一种语言匹配的所有文档,例如:

profile.languages.name = "French"

profile.languages.name = "English"

我的意思是,如果我的选项集中有法语或英语,我需要获取其语言数组中具有名称与我的选项之一匹配的元素的所有用户,无论语言级别如何。

所以,除非我错了,否则我不能这样做

db.find({"profile.languages": {$in: [{name: "French"}, {name: "English"}]});

您将如何进行?

非常感谢。

大卫

最佳答案

事实上,你几乎是对的:

db.collection.find({"profile.languages.name":{$in: ["French","English"]} })

由于 profile.languages 是一个子文档数组,因此您可以调用子文档的一个键,后续查询将映射到包含该键的所有子文档。

但是,如果没有正确的索引,添加的 .explain() 显示的内容非常难看:

{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.languages",
"indexFilterSet" : false,
"parsedQuery" : {
"profile.languages.name" : {
"$in" : [
"English",
"French"
]
}
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"profile.languages.name" : {
"$in" : [
"English",
"French"
]
}
},
"direction" : "forward"
},
"rejectedPlans" : [ ]
}
}

(serverInfo被省略)。

所以为了让这个查询高效,你需要在你想要查询的字段上创建一个索引:

db.languages.ensureIndex({"profile.languages.name":1})

现在添加的解释告诉我们,匹配文档是通过索引标识的:

{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.languages",
"indexFilterSet" : false,
"parsedQuery" : {
"profile.languages.name" : {
"$in" : [
"English",
"French"
]
}
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"profile.languages.name" : 1
},
"indexName" : "profile.languages.name_1",
"isMultiKey" : true,
"direction" : "forward",
"indexBounds" : {
"profile.languages.name" : [
"[\"English\", \"English\"]",
"[\"French\", \"French\"]"
]
}
}
},
"rejectedPlans" : [ ]
},
"ok" : 1
}

关于javascript - 如何将文档与 Mongodb 中对象属性的值进行匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31720794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com