将$ elemMatch应用于多个阵列

时间:2018-07-31 11:36:26

标签: mongodb mongodb-query

我的查询结果是:

{ 
    "_id" : ObjectId("5b5e680bca55f2885cb3c864"), 
    "barcelona" : [
        {
            "date" : ISODate("2018-07-01T00:00:00.000+0000"), 
            "name" : "david", 
            "age" : 17.0
        }
    ]
}

我的查询如下:

    db.test8.find({ line: '2' },{ barcelona: { $elemMatch: {
    date : 
    {
        "$gte" : ISODate("2018-07-01T00:00:00Z"), 
        "$lt" : ISODate("2018-07-02T00:00:00Z") 
    }
    }}});

数据集在mongodb中看起来像这样。它具有三个数组:巴塞罗那,巴黎和伦敦。我会回答您可能有的任何问题。

{ 
    "_id" : ObjectId("5b5e680bca55f2885cb3c864"), 
    "piwikID" : "2", 
    "barcelona" : [
        {
            "date" : ISODate("2018-07-01T00:00:00.000+0000"), 
            "name" : "david", 
            "age" : 11.0
        }, 
        {
            "date" : ISODate("2018-07-02T00:00:00.000+0000"), 
            "name" : "damo", 
            "age" : 16.0
        }, 
        {
            "date" : ISODate("2018-07-03T00:00:00.000+0000"), 
            "name" : "dani", 
            "age" : 12.0
        }
    ], 
    "paris" : [
        {
            "date" : ISODate("2018-07-01T00:00:00.000+0000"), 
            "name" : "david", 
            "age" : 17.0
        }, 
        {
            "date" : ISODate("2018-07-02T00:00:00.000+0000"), 
            "name" : "damo", 
            "age" : 10.0
        }, 
        {
            "date" : ISODate("2018-07-03T00:00:00.000+0000"), 
            "name" : "danp", 
            "age" : 13.0
        }
    ], 
    "london" : [
        {
            "date" : ISODate("2018-07-01T00:00:00.000+0000"), 
            "name" : "dan", 
            "age" : 11.0
        }, 
        {
            "date" : ISODate("2018-07-02T00:00:00.000+0000"), 
            "name" : "donner", 
            "age" : 12.0
        }, 
        {
            "date" : ISODate("2018-07-03T00:00:00.000+0000"), 
            "name" : "dangus", 
            "age" : 14.0
        }
    ]
};

还有其他城市parislondon等,它们是数组,应该显示在我的结果中。 如何修改查询以在结果中显示它们?

1 个答案:

答案 0 :(得分:0)

您要先对多个数组使用$elemMatch,则需要构建动态查询。

假设您在查询数据库之前已经知道城市名称,您可以构建这样的查询。

var cities = ['barcelona', 'paris', 'london'];
var query = {
    "$or": []
};
for (let i = 0; i < cities.length; i++) {
    let queryObj = {};
    queryObj[cities[i]] = {
        "$elemMatch": {
            date:
            {
                "$gte": ISODate("2018-07-01T00:00:00Z"),
                "$lt": ISODate("2018-07-02T00:00:00Z")
            }
        }
    };
    query["$or"].push(queryObj);
};

您的查询是这样的:

{
    "$or":
    [{ "barcelona": { "$elemMatch": { "date": { "$gte": ISODate("2018-07-01T00:00:00Z"), "$lt": ISODate("2018-07-02T00:00:00Z") } } } },
    { "paris": { "$elemMatch": { "date": { "$gte": ISODate("2018-07-01T00:00:00Z"), "$lt": ISODate("2018-07-02T00:00:00Z") } } } },
    { "london": { "$elemMatch": { "date": { "$gte": ISODate("2018-07-01T00:00:00Z"), "$lt": ISODate("2018-07-02T00:00:00Z") } } } }]
}
db.col.find(query);