【问题标题】:Dynamic Match Variable Mongodb动态匹配变量MongoDB
【发布时间】:2020-01-16 05:08:34
【问题描述】:

我希望能够传递一个动态 BSON 变量来匹配 mongodb。

这是我尝试过的:

var query = "\"info.name\": \"ABC\"";

var query = {
    info: {
        name: "ABC"
    }
}

在传递变量“查询”以匹配时,这些都不起作用(如下所示):

$match: {
   query
}

但像下面这样显式传递确实有效:

$match: {
   "info.name": "ABC"
}

【问题讨论】:

    标签: node.js mongodb typescript


    【解决方案1】:

    正如MongoDB documentation 所说:

    要对嵌入/嵌套文档中的字段指定查询条件,请使用点表示法。

    实际的问题是您的对象属性名称作为 JS 代码中的变量。请检查how to add a property to a JavaScript object using a variable as the name

    你可以这样做:

    var propertyName = "info.name"
    var query = {}
    query[propertyName] = "ABC"
    ...
    

    【讨论】:

      【解决方案2】:

      这就是问题所在

      var query = "\"info.name\": \"ABC\"";
      { $match: ""info.name": "ABC"" } // This is single string
      

      在这个查询中,我们得到单个字符串,这就是为什么不过滤结果 但是,当您使用像 "info.name": "ABC" 这样的显式传递时,它可以工作

      数据

      { 
        _id: ObjectId(XXXXXXXXXX),
        info: { name: "ABC" }
      }
      

      你可以使用这个聚合查询

      // Create object and use this into [$match][1] stage
         const data = { "info.name": "ABC" };
      // Use this object in match stag
               .aggregate([{ $match: data}])
      

      如果你有对象数组,那么你需要使用$elemMatch

      数据

       {  
           _id: ObjectId(XXXXXXXXXX)
           info: [{ name: "ABC" }, { name: "DEF" } ]
      }
      // use elemMatch if array of object
           .aggregate([{ $match:  { info: { $elemMatch:{ name:  "ABC" }}}}])
      

      【讨论】:

        【解决方案3】:

        当你传递一个类似的查询对象时它会起作用;

        var query = {
            "info.name": "ABC"
        }
        

        并像这样传递到聚合管道中;

        { $match: query }
        

        您可以在MongoDB Node.js Driver Tutorials查看其详细信息


        您不能使用 JSON 对象来查询嵌套字段,例如;

        var query = {
            info: {
                name: "ABC"
            }
        }
        

        检查here

        除非info 只包含name 字段,否则可以这样使用。但是你必须再次通过{ $match: query },比如here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-08
          • 1970-01-01
          相关资源
          最近更新 更多