【问题标题】:dynamically add fields to find() mongodb动态添加字段到 find() mongodb
【发布时间】:2017-07-01 17:50:20
【问题描述】:

您好,我正在使用 mongoDB,我正在尝试创建一个动态对象并作为参数传递给 find()

我的对象是这样的

图书馆

var search = {};
if(data.orderId) {

    search["_id"] = { $in: data.orderId.split(",") } ;
}if(data.path) {

    search["stops.districtId"] = data.path;
}if(data.special) {

    search["special.option"] = { $in: data.special.split(",") } ;
}if(data.userInfo) {

    search["UserId"] = data.userInfo;
}

然后我会将我的搜索对象传递给这样的查询

型号

                var col = db.collection( CustomerOrderModel.collection() );
                col.find(
                            {
                                serviceType:data.serviceType,
                                **search**
                            }
                    ).skip(data.skip).limit(data.limit).sort(data.sort).toArray(function(err, res) {

                    if (err) {

                        reject( err );
                    } else {

                        resolve( res );
                    }
                });

这里的问题是当我 console.log 我可以看到我的搜索对象时

'special.option': { '$in': [ 'ROUND_TRIP' ] } }

我的 $in 用引号括起来。所以我的查询不起作用。

如果我在查询中直接输入"special.option": { $in: [ 'ROUND_TRIP' ] } },它工作正常。

我正在尝试构建此搜索对象,因为我有多个字段要使用复杂的逻辑进行搜索。我不想在我的 模型,所以我将在我的库中创建搜索对象。

有没有办法解决这个问题,先谢谢了。

【问题讨论】:

  • 您是否认真地将您的搜索对象传递给这样的查询{ serviceType:data.serviceType, **search** }

标签: node.js mongodb nosql


【解决方案1】:

您应该通过将额外的过滤器添加到搜索对象中来使搜索对象成为查询的一部分。正如你目前所做的那样

col.find({
    serviceType:data.serviceType,
    search
})

这被解释为

col.find({
    serviceType:data.serviceType,
    { 'special.option': { '$in': [ 'ROUND_TRIP' ] } } 
})

您应该能够使用方括号表示法将serviceType 过滤器添加到现有搜索对象,如下所示:

search["serviceType"] = data.serviceType;

然后您可以在查询中传递该对象:

var col = db.collection( CustomerOrderModel.collection() );
search["serviceType"] = data.serviceType;
col.find(search)
   .skip(data.skip)
   .limit(data.limit)
   .sort(data.sort)
   .toArray(function(err, res) {
        if (err) {  reject( err ); } 
        else {  resolve( res ); }
    });

【讨论】:

  • 是的,问题出在 :) :) 非常感谢
【解决方案2】:

这不是问题。

console.log({ "special.option": { $in: [ 'ROUND_TRIP' ] } });

给了

{ 'special.option': { '$in': [ 'ROUND_TRIP' ] } }

所以这是正确的。

在您的代码中,您只需在最关键的部分写 **search**,但试试这个:

search["serviceType"] = data.serviceType;
col.find( search )

【讨论】:

  • oops ,似乎错误是因为我用 {} 包装了 find 。如果我用 col.find({ search }) 尝试您的代码,它不起作用,但如果我尝试 col.find(search) 它可以工作。 :) 非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
相关资源
最近更新 更多