【问题标题】:I need to populate only active records in mongodb我只需要在 mongodb 中填充活动记录
【发布时间】:2017-01-31 10:03:55
【问题描述】:

我正在尝试使用 node.js 中的 moongose 在 mongodb 中查找子集合,但它会查找所有子记录,我只想查找活动记录。

父集合是用户 子集合 - 包含用户发布的帖子并具有 user_id 作为用户集合的引用的帖子。我试过下面的查询,但没有运气

用户收集示例:

{
    "_id" : ObjectId("584016e28880811461000007"),
    "fname" : "Test",
    "lname" : "user",
    "email" : "test@user.com",
},
{
    "_id" : ,
    "fname" : "Test2",
    "lname" : "user2",
    "email" : "test2@user.com",
}

收集后样本:

{
    "_id" : ObjectId("5863aed8cafb42674600000e"),
    "user_id" : ObjectId("584016e28880811461000007"),
    "title" : "Post 1",
    "is_deleted" : false

},

{
    "_id" : ,
    "user_id" : ObjectId("584016e28880811461000007"),
    "title" : "Post 2",
    "is_deleted" : true

}

我试过的查询:

Users.collection.aggregate([
{ $lookup: {from: "Posts", localField: "_id", foreignField: "user_id", as: "Posts"} },
{ $match : { $or : [{"Posts._id" : {$exists : true}, "Posts.is_deleted" : false}] }},
{$project: {fname: "$fname", lname : "$lname", email : "$email", "publishedPosts" : {$size : "$Posts"}}}

])

我从上面的代码得到的结果:

[
    {"fname" : "Test", "lname" : "user", "email" : "test@user.com", "publishedPosts" : 2},
    {"fname" : "Test2", "lname" : "user2", "email" : "test2@user.com", "publishedPosts" : 0}
    ]

预期结果:

[
{"fname" : "Test", "lname" : "user", "email" : "test@user.com", "publishedPosts" : 1},
{"fname" : "Test2", "lname" : "user2", "email" : "test2@user.com", "publishedPosts" : 0}
]

它查找所有帖子,is_deleted 是假还是真

请帮我解决一些对我有用的类似查询

【问题讨论】:

  • 请提供来自用户和帖子集合的示例文档,以及预期的输出
  • @felix 请检查问题,我为你编辑了它
  • @felix 我非常抱歉,但我错误地输入了错误的预期结果。现在好了
  • 我更新了答案,现在应该可以正常工作了

标签: mongodb mongoose


【解决方案1】:

您使用的 $match 阶段是错误的。第一个条件({"Posts._id" : {$exists : true})没有用,因为每个文档都必须有一个 _id 字段(有关详细信息,请参阅mongodb _id field)。

更新:在 $lookup 之前执行 $match 阶段以获得更好的性能。从 Posts 到 Users 查找,然后展开 Users 和 group 文档以获得总和

此查询返回您期望的结果:

db.Posts.aggregate([
       {
          $match:{
             is_deleted:false
          }
       },
       {
          $lookup:{
             from:"Users",
             localField:"user_id",
             foreignField:"_id",
             as:"Users"
          }
       },
       {
          $unwind:"$Users"
       },
       {
          $group:{
             _id:"$user_id",
             lname:{
                $first:"$Users.lname"
             },
             fname:{
                $first:"$Users.fname"
             },
             email:{
                $first:"$Users.email"
             },
             publishedPosts:{
                $sum:1
             }
          }
       }
    ])

输出:

{ "_id" : ObjectId("584016e28880811461000007"), "lname" : "user", "fname" : "Test", "email" : "test@user.com", "publishedPosts" : 1 }

【讨论】:

  • 但它不会返回从未发布任何帖子的用户。我们需要向用户显示他们发布的帖子数量。如果没有帖子比需要显示0
【解决方案2】:

你可以试试这个,效果很好

店铺收藏

{
name:"shop1",
status:true,
_id : ObjectId("583d0c1f2bd2cbdb117053c5")
}

{
    name:"shop2",
    status:false,
    _id : ObjectId("583d0c1f2bd2cbdb117053c6")
    }

订单收集

{
orderNo:1,
price:100,
product:"product1",
shop:ObjectId("583d0c1f2bd2cbdb117053c5")
}

试试这个

db.getCollection('orders').aggregate([
        {
          $lookup:
            {
              from: "shop",
              localField: "shop",
              foreignField: "_id",
              as: "shopData"
            }
       },
       { $match : { $or: [ { "shopData.status": true}] } }

    ])

结果:

[{
orderNo:1,
price:100,
product:"product1",
shop:[{
name:"shop1",
status:true,
_id : ObjectId("583d0c1f2bd2cbdb117053c5")
}]
}]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    相关资源
    最近更新 更多