我的查询结果是:
{
"_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
}
]
};
还有其他城市paris
,london
等,它们是数组,应该显示在我的结果中。
如何修改查询以在结果中显示它们?
答案 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);