如何在文档中动态查询对象

时间:2019-06-10 08:10:38

标签: node.js mongodb object

我在db中有以下结构的文件

{
    "_id" : ObjectId("5cfcd787cbac8d69e6db1a8"),
    "__v" : 0,
    "summary" : {
        "Boundry" : false,
        "Six" : false,
        "Wicket" : false,
    }
}

我想根据摘要(即边界,六和小门)查找数据

我能够通过使用“点”运算符来获取数据,即

db.getCollection('colection_name').find({"summary.Boundry": true})

但是我希望它是动态的,以便可以通过多个摘要键找到数据

Boundry的动态含义是通过“ summary.Boundry”查找数据:是的,对于六个,我需要通过“ summary.Six”查找数据:true我想使“ summary。+”。“ Six”类型的字符串它可以动态搜索吗?

我尝试过ElemMatch进行查询,但它似乎只能在数组中使用

预先感谢

3 个答案:

答案 0 :(得分:1)

您可能需要详细说明“动态”的含义,但是,如果您只想同时匹配一个或多个字段,则可以包括以下内容:

db.getcollection('collection_name')
.find(
  { 'summary.Boundry': true }, 
  { 'summary.Six': true }
)

默认情况下,MongoDB将$and逻辑运算符应用于您的条件。 如果您想要“或”匹配,则可以使用$or

答案 1 :(得分:1)

您可以使用对象,并根据您的条件使其动态化

var search={};
    if (yourcondition) {
    search = {"summary.Boundry":true};
    }else if (next condition) {
    search = {"summary.Six":true};
    }else if (next condition) {
    search = {"summary.Wicket":true};
    }

答案 2 :(得分:1)

您的问题仍然没有很好地形成,但是我从您的问题中得到了什么,您不愿意像

这样的硬代码查询
db.getCollection('colection_name').find({"summary.Boundry": true})

所以我的建议是您可以动态创建查询对象,例如 示例1:如果您需要所有边界,则

 query({"summary.Boundry": true}, {}, {}, function(err, res)=> { // Your further code});

示例2:如果要全部六个,则

query({"summary.Six": true}, {}, {}, function(err, res)=> { // Your further code});

查询功能的实现就像(我添加了项目和选项,以防万一您还没有文档的全部键)

function query(condition, projection, options, callback){
    db.getCollection('colection_name').find(condition, projection, options, callback)
}

希望我能解决你的问题。