在mongodb查询中添加自定义字段

时间:2014-03-19 10:50:55

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

我对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)
  • 如果帖子不是我的

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

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

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

{

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

}

谢谢谢谢,提前致谢

1 个答案:

答案 0 :(得分:2)

好的,所以找不到这个。但是有一种模糊的方法可以使用aggregate来获得结果。假设您在{strong>您的 ID:

的某处有一个creatorId变量
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的字段值与您存储的的变量值进行比较。当他们平等时#34;条件为true,否则为false

因此,欢迎聚合。这是一个非常强大的工具,可以获得您想要的结果,而且您​​不仅可以" group"事情在一起,但以其他方式将文档转换为您想要的形式

请参阅驱动程序文档以获取语言详细信息(此处提供的是适用于所有人的JSON),但您基本上是在管道的每个阶段形成BSON文档。