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

标签 javascript mongodb meteor

我正在尝试匹配 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/

相关文章:

javascript - 关于变量赋值的说明? "var x = !0"

mongodb - 如何从聚合中隐藏_id?

javascript - 如何更改 Meteor.users _id?

mongodb - 在 Meteor 中,发布有限制的搜索结果时,为什么结果上的 ".count"显示超过限制?

javascript - 我如何在 meteor 1.3 中需要一个文件?

javascript - 将 Javascript、Jquery 与 PHP、Mysql 结合用于工具提示

javascript - Meteor 1.3 模块 - 如何在控制台中使用 npm 导入的库?

javascript - 参数传递与本地存储

java - MongoDB "find"查询具有多个查询文档

meteor - 使用客户端和服务器目录组织 Meteor