对嵌套的Objects数组进行$ lookup

时间:2017-08-19 00:35:07

标签: node.js mongodb mongoose aggregation-framework nosql

在我的项目Node和Mongo项目中,我使用mongoose进行建模。 我正在尝试对嵌套文档执行查找。 我有一个线程对象,其中一个“post”对象数组作为其属性之一。这个嵌套的“post”对象的一个​​属性是user_id,即发布的人。 我试图查找user_id(即 - localfield:thread.post.user_id,来自用户,foreignfield:_id),但是shell一直没有返回。

任何人都可以建议对我在下面尝试的内容进行修改:

db.threads.aggregate([
{ "$match": { "posts._id": ObjectId("abcdef") } },
{ "$sort": { "dateAdded": -1 } },
{ "$limit": 15 },
{ "$lookup": {"localField": "posts.user_id","from": "users","foreignField": "_id","as": "userinfo"} },
{ "$unwind": "$userinfo" },
{ "$project":{"dateAdded":1,"userinfo.name":1,"userinfo.username":1}}
]);

我的馆藏中的记录样本

db.threads.find({})返回...

{ 
"_id" : ObjectId("78910"), 
"dateAdded" : ISODate("2017-08-18T16:44:23Z"), 
"title" : "Thread Zero", 
"posts" : [ { 
"_id" : ObjectId("abcdef"), 
"user_id" : ObjectId("12345"), 
"postText" : "good evening", 
"dateAdded" : "2017-8-18 17:44:34" }  ],
 "__v" : 0 
}

db.users.find({})返回...

示例用户对象

{ 
"_id" : ObjectId("12345"), "name" : "James Free", 
"name" : "Al Isonwunderland", 
"password" : "$2a$10$ILpitvg1.o8X8GnaSaoG4ulnuNWrFTUfhQDA8CdihbHPjBrB8NaVm", 
"username" : "muppet", 
"__v" : 0 
}

因此,我希望从线程上的每个帖子的“user”对象返回name属性。 我写的是尝试获取一个特定帖子的用户名称广告用户名,我会假设检索所有评论的用户名和名称是将$ match参数留空,允许它返回一个帖子列表使用用户的名称/用户名

有人可以证实吗?

1 个答案:

答案 0 :(得分:0)

我将ObjectId替换为uuid属性,因为ObjectId很难处理(Mongo shell的#find()函数返回为ObjectId(" 5998a2a81762e90ce9f55d92"),然后从数据库中读取它只是字母数字(" 5998a2a81762e90ce9f55d92")返回,然后将该字母数字输入shell以测试命令始终返回null)

以下解决了我的问题,

db.threads.aggregate([
    {$match: {uuid: 'de36dd72-238b-47b0-b363-3fbfa1f2743e'}},
    {$unwind:"$posts"},
    {$lookup: {
        from: 'users', 
        localField: 'posts.user_uuid', 
        foreignField: 'uuid', 
        as: 'userInfo'}}
]);

MongoDB $lookup on nested document   证明有用。 希望这能帮助其他人一路走来