gpt4 book ai didi

MongoDB 文档嵌套文档过滤

转载 作者:行者123 更新时间:2023-12-04 16:10:41 26 4
gpt4 key购买 nike

我正在与 MongoDb 战斗

我有一个文档集合,单个文档的结构如下

{
"_id": { "$oid": "588a931d5c98fe0f3f84d93f" },
"name": "Michele",
"type": "F",
"category": "G",
"meta":{
"code": "113835667",
"updated": {"$date": "2017-02-07T00:00:00.000Z"},
"since": {"$date": "2013-11-07T23:00:00.000Z"}
},
"data": [
{
"date": {"$date": "2013-11-07T23:00:00.000Z"},
"close": 12.23
}
... // removed
{
"date": {"$date": "2017-02-07T00:00:00.000Z"},
"close": 15.22
}
]
}

我需要实现的是返回具有匹配 _id 的文档,但从数据数组中过滤掉日期属性不在指定时间范围内的文档。

这是我一直以来的尝试

 let id;    //[DocumentId]
let from; //[Date]
let to; //[Date]
collection.aggregate([
{ $match: { _id: { $eq: id } } },
{ $unwind: '$data' },
{ $match: { 'data.date': { $gte: from, $lte: to } } },
{ $group: { _id: '$_id',
data: { $push: { date:'$data.date', close: '$data.close' } } } }
], ...);

这种方法的问题是我返回的文档只包含 _id 和数据属性[数据过滤结果是好的],而我需要返回完整的可用属性集。

非常感谢您的建议!

最佳答案

如果您可以升级到 Mongo 3.4(最新的稳定版本),它可以很好地完成:

db.collection.aggregate([
//Pre-filter to have data arrays with at least one matching date
{$match: {_id: id, 'data.date': {$gte: from, $lte: to}}},
//Filter the items array
{
$addFields: {
'items': {
$filter: {
input: '$data', as: 'item', cond: {
$and: [
{$gte: ["$$item.date", from]},
{$lte: ["$$item.date", to]}
]
}
}
}
}
}
]);

如果你必须保留 mongo 3.2,我唯一能想到的就是像这样使用 $ROOT:

db.collection.aggregate([
{$match: {_id: id, 'data.date': {$gte: from, $lte: to}}},
{
$project: {
'filteredData': {
$filter: {
input: '$data', as: 'item', cond: {
$and: [
{$gte: ["$$item.date", from]},
{$lte: ["$$item.date", to]}
]
}
}
},
'originalDocument': '$$ROOT'
}
}
]);

生成的对象将具有 originalDocument 和 filteredData 作为属性,您需要在服务器代码中处理它们(实际上是一个循环)。

关于MongoDB 文档嵌套文档过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42110650/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com