尝试匹配mongodb

时间:2015-06-27 13:32:52

标签: mongodb mongodb-query

我是mongodb的新手,现在正在使用聚合。 我遇到了一个问题,我有2列让这个column1和column2我要匹配$ match中的column1或column2是否有可能。我被困了,请帮忙。

db结构:

{
  "_id" : ObjectId("55794aa1be1f8fe822da139d"),
  "transactionType" : "1",
   "_store" : {
    "storeLocation" : "Pitampura",
    "storeName" : "Godown",
    "_id" : "5576b5c5e414d90c03d1e330"
  }
}

我尝试根据transactionType和storeName进行过滤,我将这2个参数发送给api,但是当storeName作为空字符串发送时,则只根据transactionType对两个参数进行过滤。不想使用if-elseif。

1 个答案:

答案 0 :(得分:0)

当然,它可以满足您的查询。你只需处理如下:

// Initial data
var request = { "storeName": "", "transactionType": "1" };

// Transform to array
var conditions = Object.keys(request).map(function(key) {
    var obj = {},
        newKey = "";
    if ( key == "storeName" ) {
        newKey = "_store." + key;
    } else {
        newKey = key;
    }

    obj[newKey] = request[key];
    return obj;
});

db.collection.find({ "$or": conditions });

转化后的整个结构分解为:

db.collection.find({
    "$or": [
        { "_store.storeName": "" },
        { "transactionType": "1" }
    ]
})

当然,在" transactionType"满足了。

这就是$or的作用,认为查询参数中至少有一个条件与文档中的数据匹配。

另一件事是,由于请求中提供的数据不是"直接匹配"对于文档中的数据,操作是在"键名称"使用正确的"dot notation"表单来获取该元素。

这些只是基本查询,因此相同的规则适用于聚合$match,它本身只是一个查询元素:

db.collection.aggregate([
    // Possibly other pipeline before

    // Your match phase, which probably should be first
    { "$match": {
        "$or": [
            { "_store.storeName": "" },
            { "transactionType": "1" }
        ]
    }},

    // Other aggregagtion pipeline

])