Mongodb:从两个集合收集数据的正确方法?
我有两个收藏:一个是Mongodb:从两个集合收集数据的正确方法?,mongodb,spring-boot,spring-data-mongodb,Mongodb,Spring Boot,Spring Data Mongodb,我有两个收藏:一个是items,第二个是user\u item\u history。我想获取具有其状态的项目。每个项目的状态存储在user\u item\u history中,项目的其他详细信息存储在items集合中。我们必须过滤特定用户和项目类别的数据。所以用户id和类别在用户项历史集合中 用户项目历史记录: { "_id" : NumberLong(25424), "_class" : "com.samepinch.domain.registration.UserItemHi
items
,第二个是user\u item\u history
。我想获取具有其状态的项目。每个项目的状态存储在user\u item\u history
中,项目的其他详细信息存储在items
集合中。我们必须过滤特定用户和项目类别的数据。所以用户id和类别在用户项历史集合中
用户项目历史记录
:
{
"_id" : NumberLong(25424),
"_class" : "com.samepinch.domain.registration.UserItemHistory",
"user_id" : NumberLong(25416),
"item_id" : NumberLong(26220),
"catagoryPreference" : "BOTH",
"preference" : 0.6546536707079772,
"catagory" : "FOOD",
"status" : 1,
"createdDate" : ISODate("2015-09-02T07:50:36.760Z"),
"updatedDate" : ISODate("2015-09-02T07:55:24.105Z")
}
项目
:
{
"_id" : NumberLong(26220),
"_class" : "com.samepinch.domain.item.Item",
"itemName" : "Shoes",
"categoryName" : "SHOPPING",
"attributes" : [
"WESTERN",
"CASUAL",
"ELEGANT",
"LATEST"
],
"isAccessed" : false,
"imageUrl" : "0bd2838e-9349-432a-a200-6e6b659e853eitemcompressed.jpg",
"catagoryPreference" : "FEMALE",
"startDate" : ISODate("2015-11-26T18:30:00Z"),
"endDate" : ISODate("2015-11-27T18:30:00Z"),
"location" : {
"coordinates" : [
77.24149558372778,
28.56973445677584
],
"type" : "Point",
"radius" : 2000
},
"createdDate" : ISODate("2015-11-16T10:49:11.858Z"),
"updatedDate" : ISODate("2015-11-16T10:49:11.858Z")
}
最后,我希望有以下格式的文件:
{
item_id:26220,
status:1,
imageUrl: "0bd2838e-9349-432a-a200-6e6b659e853eitemcompressed.jpg"
}
更新到MongoDB 3.2,您将能够使用聚合阶段,其工作方式类似于SQL连接 一对多关系 如果每个
项目
文档都有许多相应的用户项目历史
文档,则可以将项目状态列表作为数组获取
查询
db.items.aggregate([
{
$lookup:
{
发件人:“用户\项目\历史记录”,
localField:“\u id”,
foreignField:“项目id”,
as:“项目历史记录”
}
},
{
$项目:
{
项目编号:1,
状态:“$item_history.status”,
imageUrl:1
}
}])
示例输出
{
“_id”:长号码(26220),
“imageUrl:“0bd2838e-9349-432a-a200-6e6b659e853eitemcompressed.jpg”,
“地位”:[1]
},
{
“_id”:长号码(26233),
“imageUrl:“0bd2838e-9349-432a-a200-6e6b659e853eitemcompressed.jpg”,
“地位”:[1,2]
}
一对一关系
如果每个项目只有一个对应的历史记录文档,则可以使用以下方法获得所需的确切格式:
查询
db.items.aggregate([
{
$lookup:
{
发件人:“用户\项目\历史记录”,
localField:“\u id”,
foreignField:“项目id”,
as:“项目历史记录”
}
},
{
$unwind:“$item\U历史记录”
},
{
$项目:
{
项目编号:1,
状态:“$item_history.status”,
imageUrl:1
}
}])
示例输出
{
“_id”:长号码(26220),
“imageUrl:“0bd2838e-9349-432a-a200-6e6b659e853eitemcompressed.jpg”,
“地位”:1
}
请记住,每添加一个聚合管道阶段,性能就会恶化。因此,即使您有一对一的关系,您也可能更喜欢一对多查询
应用过滤
在编辑中,您添加了以下内容:
我们必须过滤特定用户和项目类别的数据。因此,用户id和类别位于用户项历史集合中
要筛选结果,应向查询中添加一个步骤:
db.items.aggregate([
{
$lookup:
{
发件人:“用户\项目\历史记录”,
localField:“\u id”,
foreignField:“项目id”,
as:“项目历史记录”
}
},
{
$unwind:“$item\U历史记录”
},
{
$match:
{
“项目历史。用户id”:编号长(25416),
“项目历史分类”:“食品”
}
},
{
$项目:
{
项目编号:1,
状态:“$item_history.status”,
imageUrl:1
}
}])
请注意,在您的示例数据中,“category”被拼错为“catagory”,因此我在上面的查询中也将其拼错了。您使用的是哪个版本的MongoDB?您能使用MongoDB 3.2吗?我使用的是MongoDB的3.0.6版本。我可以切换到MongoDB 3.2,它没有问题。谢谢你的回答,它对我来说很有用。但我如何在其中添加标准呢。我还想知道特定用户的项目状态?@Abhisheksaini用于指定条件。先生,我需要帮助,我已更新了问题,因此请使用匹配条件更新您的答案。@Abhisheksaini我已更新了我的答案。希望这对你有用。如果您还有任何问题,请将其作为单独的问题发布,不要再修改此问题。先生,它不起作用。现在我没有得到任何结果,即使我有一个用户的id也。