我是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。
答案 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
])