【问题标题】:Add custom fields in mongodb query在 mongodb 查询中添加自定义字段
【发布时间】:2014-03-19 10:50:54
【问题描述】:

我有一个关于 mongodb 集合的问题

这是我的帖子集

{ 

  "_id" : ObjectId("530f67584fb1a510bc18c03f"),
  "creatorId" : "5f6f2c26-4101-4eae-90d1-20d109bea925",
  "creationDate" : ISODate("0001-01-01T00:00:00Z"),
  "category" : 23,
  "location" : [
      -60.67045855832774,
       52.86982649605247
  ], 
 "replies" : 
    [
       {
        "_id" : ObjectId("531acfc34fb1a50edc86fdcb"),
       "creatorId" : "0891f887-a6bc-4183-be10-2653b7b45e79"
       },
       {
      "_id" : ObjectId("531acfc34fb1a50edc86fdcb"),
     "creatorId" : "0891f887-a6bc-4183-be10-2653b7h76s22"
   }
]

}

我执行一个查询,传递正在观看页面的 clientId 和一个多边形以返回多边形区域中的所有帖子,我想添加一个自定义字段,因为我想知道这些信息:

  • 如果 Post 是我的 (clientId == creatorId)

    • 如果有回复(replies.count > 0)
  • 如果帖子不是我的

    • 如果有一个我的回复(有一个回复,replies.creatorId == clientId)

我只想在一个查询中执行此操作,因为我想查看所有帖子列表并了解帖子的不同颜色标记。

我想要的结果是这样的(如果可能的话)或其他返回所需信息的结果。

{

  "_id" : ObjectId("530f67584fb1a510bc18c03f"),
  "category" : 23,
  "location" : [
      -60.67045855832774,
       52.86982649605247
  ],
  "isMine" : true,
  "replies" : 20,
  "OneAnswerIsMine": false

}

谢谢谢谢提前谢谢

L

【问题讨论】:

    标签: mongodb mongodb-.net-driver mongodb-query


    【解决方案1】:

    好的,所以 find 无法做到这一点。但是有一种晦涩的方法可以使用aggregate 获得结果。所以假设你有一个creatorId 变量是你的 Id:

    db.collection.aggregate([
        // Match your posts
        { "$match": { "creatorId": creatorId },
    
        // Unwind the array
        { "$unwind": "$replies" },
    
        // Project the fields you want, notice the logical conditions
        { "$project": {
            "category": 1,
            "location": 1,
            "isMine": { "$eq": [ "$creatorId", creatorId ] },
            "answerIsMine": { "$eq": [
                "$replies.creatorId",
                creatorId
            ]}
        }},
    
        // Group on the unique document, get sum and max value
        { "$group": {
            "_id": {
                "_id": "$_id",
                "category": "$category",
                "location": "$location",
                "isMine": "$isMine",
            },
            "replies": { "$sum": 1 },
            "OneAnswerIsMine": { "$max": "$answerIsMine" }
        }},
    
        // Nicer Output
        { "$project": {
            "_id": "$_id._id",
            "category": "$_id.category",
            "location": "$_id.location",
            "isMine": "$_id.isMine",
            "replies": 1,
            "OneAnswerIsMine": 1
        }}
    ])
    

    除此之外,您的“自定义字段”是使用逻辑 $eq 运算符生成的。在这里,我们将 creatorId 的字段值与您存储的 you 的变量值进行比较。当它们“相等”时,条件为true,否则为false

    所以,因此欢迎聚合。这是获得您想要的结果的非常强大的工具,您不仅可以将事物“组合”在一起,还可以将文档转换为您想要的形式

    请参阅您的驱动程序文档以了解语言详细信息(此处提供的每个人都是 JSON),但您基本上将 BSON 文档形成为管道的每个阶段。

    【讨论】:

    • 难以置信!!非常感谢。我马上试试。最后一个问题:我可以插入一个地理多边形“和条件”吗?再次感谢卢卡
    猜你喜欢
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    相关资源
    最近更新 更多