Mongo 查询根据相同的字段值和未过期的值来获取文档
Mongo Query to fetch documents on the basis of same field value and those which are not expired
我有一些collection分享,分享中有sharedWith,expiryTime字段collection.
sharedWith 字段是一个数组,指定已与这些用户进行共享,它包含用户的 ID。
sharedWith : [NumberLong(11),NumberLong(22),NumberLong(33)]
我需要获取那些与同一用户进行了多次共享的文档,这意味着输出应该 return 多个具有相同 sharedWith 值的共享文档和未过期的文档:
// condition to check whether document has been expired or not
currentTime < expiryTime // means the sharing document has not been expired
currentTime : (当前时间今天)
expiryTime : (expiryTime是分享中的一个字段collection)
示例:
A
{sharedWith : [NumberLong(123),NumberLong(456)],
expiryTime : ISODate("2021-07-03T06:22:29.021Z")
},
B
{sharedWith : [NumberLong(456)],
expiryTime : ISODate("2021-07-03T06:22:29.021Z")
},
C
{sharedWith : [NumberLong(123456)],
expiryTime : ISODate("2021-07-03T06:22:29.021Z")
},
D
{sharedWith : [NumberLong(111111)],
expiryTime : ISODate("2021-06-03T06:22:29.021Z")
},
这种情况的输出将只有 A 和 B,因为它们具有共同的 sharedWith 字段值 NumberLong(456) 并且没有过期,因为今天的时间(当前时间:7 月 1 日)小于 expiryTime。
注意:如果 collection B 的 currentTime >= expiryTime 意味着如果它已过期那么它不应该 return 任何输出,因为在这种情况下文档 A 或 C 不能单独 returned,因为输出必须包含多个具有相似 sharedWith 字段值的共享文档,即使它没有过期。文档 D 超出范围,因为它自今天时间 > expiryTime for D.
起已过期
如何更新以下查询以实现此目的。非常感谢
db.getCollection('sharing').aggregate([
{
$addFields: { time: { $lt: ["$currentTime", "$expiryTime"] } }
},
{
$match: { time: true }
},
{ $group: {
// Group by fields to match on sharedWith
_id: { sharedWith: "$a"},
// Count number of matching docs for the group
count: { $sum: 1 },
// Save the _id for matching docs
docs: { $push: "$_id" }
}},
// Limit results to duplicates (more than 1 match)
{ $match: {
count: { $gt : 1 }
}}
]);
这是最后一个查询,但我认为它不能用作 AND 条件,我只想要那些 sharedWith 值相同且 currentTime < expiryTime
的记录
下面的查询解决了这个问题...
$unwind 用于将数组拆分为各个字段,以便 $group 在 sharedWith
上工作
db.getCollection('sharing').aggregate([
{
$match: { "expiryTime":{"$gte": ISODate()} }
},
{ $unwind: "$sharedWith"},
{ $group: {
// Group by fields to match on sharedWith
_id: "$sharedWith",
// Count number of matching docs for the group
count: { $sum: 1 },
// Save the _id for matching docs
docs: { $push: "$_id" }
}},
// Limit results to duplicates (more than 1 match)
{ $match: {
count: { $gt : 1 }
}}
]);
我有一些collection分享,分享中有sharedWith,expiryTime字段collection.
sharedWith 字段是一个数组,指定已与这些用户进行共享,它包含用户的 ID。
sharedWith : [NumberLong(11),NumberLong(22),NumberLong(33)]
我需要获取那些与同一用户进行了多次共享的文档,这意味着输出应该 return 多个具有相同 sharedWith 值的共享文档和未过期的文档:
// condition to check whether document has been expired or not
currentTime < expiryTime // means the sharing document has not been expired
currentTime : (当前时间今天)
expiryTime : (expiryTime是分享中的一个字段collection)
示例:
A
{sharedWith : [NumberLong(123),NumberLong(456)],
expiryTime : ISODate("2021-07-03T06:22:29.021Z")
},
B
{sharedWith : [NumberLong(456)],
expiryTime : ISODate("2021-07-03T06:22:29.021Z")
},
C
{sharedWith : [NumberLong(123456)],
expiryTime : ISODate("2021-07-03T06:22:29.021Z")
},
D
{sharedWith : [NumberLong(111111)],
expiryTime : ISODate("2021-06-03T06:22:29.021Z")
},
这种情况的输出将只有 A 和 B,因为它们具有共同的 sharedWith 字段值 NumberLong(456) 并且没有过期,因为今天的时间(当前时间:7 月 1 日)小于 expiryTime。
注意:如果 collection B 的 currentTime >= expiryTime 意味着如果它已过期那么它不应该 return 任何输出,因为在这种情况下文档 A 或 C 不能单独 returned,因为输出必须包含多个具有相似 sharedWith 字段值的共享文档,即使它没有过期。文档 D 超出范围,因为它自今天时间 > expiryTime for D.
起已过期如何更新以下查询以实现此目的。非常感谢
db.getCollection('sharing').aggregate([
{
$addFields: { time: { $lt: ["$currentTime", "$expiryTime"] } }
},
{
$match: { time: true }
},
{ $group: {
// Group by fields to match on sharedWith
_id: { sharedWith: "$a"},
// Count number of matching docs for the group
count: { $sum: 1 },
// Save the _id for matching docs
docs: { $push: "$_id" }
}},
// Limit results to duplicates (more than 1 match)
{ $match: {
count: { $gt : 1 }
}}
]);
这是最后一个查询,但我认为它不能用作 AND 条件,我只想要那些 sharedWith 值相同且 currentTime < expiryTime
的记录下面的查询解决了这个问题... $unwind 用于将数组拆分为各个字段,以便 $group 在 sharedWith
上工作db.getCollection('sharing').aggregate([
{
$match: { "expiryTime":{"$gte": ISODate()} }
},
{ $unwind: "$sharedWith"},
{ $group: {
// Group by fields to match on sharedWith
_id: "$sharedWith",
// Count number of matching docs for the group
count: { $sum: 1 },
// Save the _id for matching docs
docs: { $push: "$_id" }
}},
// Limit results to duplicates (more than 1 match)
{ $match: {
count: { $gt : 1 }
}}
]);