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也。