【问题标题】:How to query object dynamically in documents [duplicate]如何在文档中动态查询对象[重复]
【发布时间】:2019-10-24 15:19:01
【问题描述】:

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

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

我想根据摘要查找数据,即边界,六和检票口

我可以通过使用“点”运算符来获取我的数据,即

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

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

对于边界而言,动态通过“summary.Boundry”查找数据:true,对于六,我需要通过“summary.Six”查找数据:true 我想制作“summary”+“.Six”这样的字符串它可以动态搜索这可能吗?

我已经尝试ElemMatch 进行查询,但它似乎只能在数组中工作

提前致谢

【问题讨论】:

  • 我对你的问题有点困惑——你是不是想写一个像{"summary.Boundry": true, "summary.Six": false } 这样的查询?还是您想提出一个聚合?
  • 只用字符串插值db.getCollection('colection_name').find({[summary.${key}]: true})

标签: node.js mongodb object


【解决方案1】:

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

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

默认情况下,MongoDB 将 $and 逻辑运算符应用于您的条件。 如果你想要一个非此即彼的匹配,你可以使用$or

【讨论】:

  • 其实$and操作符在第一种情况下并不是必须的。它可能只是db.getcollection('collection_name').find({'summary.Boundry': true}, {'summary.Six': true })
  • @VirgilioGM 很酷,我不是 MongoDB 的忠实用户,只是使用文档。就像其他语言一样,有速记/默认行为很酷:)
  • 嗨@James 更新了我的问题
【解决方案2】:

您可以像这样根据您的情况使用对象并使其动态化

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

【讨论】:

    【解决方案3】:

    你的问题仍然没有很好的形成,但我从你的问题中得到了什么,你不会像这样对查询进行硬编码

    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)
    }
    

    希望我能解决你的问题。

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-22
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多