【发布时间】:2016-05-20 07:01:50
【问题描述】:
我有以下数据。我想根据某些条件从 od 数组中获取对象。除此之外,我还想获得 em 和 name 字段。
我对@987654321@不是很熟悉。所以我需要帮助来解决我的问题。
{
_id : 1,
em : 'abc@12s.net',
name : 'NewName',
od :
[
{
"oid" : ObjectId("1234"),
"ca" : ISODate("2016-05-05T13:20:10.718Z")
},
{
"oid" : ObjectId("2345"),
"ca" : ISODate("2016-05-11T13:20:10.718Z")
},
{
"oid" : ObjectId("57766"),
"ca" : ISODate("2016-05-13T13:20:10.718Z")
}
]
},
{
_id : 2,
em : 'ab6c@xyz.net',
name : 'NewName2',
od :
[
{
"oid" : ObjectId("1234"),
"ca" : ISODate("2016-05-11T13:20:10.718Z")
},
{
"oid" : ObjectId("2345"),
"ca" : ISODate("2016-05-12T13:20:10.718Z")
},
{
"oid" : ObjectId("57766"),
"ca" : ISODate("2016-05-05T13:20:10.718Z")
}
]
}
我尝试使用 $match、$project 和 $unwind of aggregate 来获得所需的结果。我的查询如下:-
db.collection.aggregate([
{
$match : {
"od.ca" : {
'$gte': '10/05/2016',
'$lte': '15/05/2016'
}
}
},
{
$project:{
_id: '$_id',
em: 1,
name : 1,
od : 1
}
},
{
$unwind : "$od"
},
{
$match : {
"od.ca" : {
'$gte': '10/05/2016',
'$lte': '15/05/2016'
}
}
}])
我得到的结果是 em 和 name 和 od 数组,其中一个来自 od 的对象,即同一个电子邮件 ID 有多个记录。
{
_id : 1,
em : 'abc@12s.net',
name : 'NewName',
od :
[
{
"oid" : ObjectId("57766"),
"ca" : ISODate("2016-05-13T13:20:10.718Z")
}
]
}
{
_id : 1,
em : 'abc@12s.net',
name : 'NewName',
od :
[
{
"oid" : ObjectId("2345"),
"ca" : ISODate("2016-05-11T13:20:10.718Z")
}
]
}
但我想要的是返回结果将是每个电子邮件 ID,在 od 数组中匹配条件的所有对象。我想要的一个样本输出是:-
{
_id : 1,
em : 'abc@12s.net',
name : 'NewName',
od :
[
{
"oid" : ObjectId("2345"),
"ca" : ISODate("2016-05-11T13:20:10.718Z")
},
{
"oid" : ObjectId("57766"),
"ca" : ISODate("2016-05-13T13:20:10.718Z")
}
]
}
我在查询中做错了什么?如果查询假设返回这样,我怎样才能得到我想要的结果?有人可以告诉我应该尝试什么或查询中的哪些更改可以帮助我获得想要的结果吗?
【问题讨论】:
标签: javascript mongodb mongodb-query aggregation-framework