MongoDB查询可以跟踪以前的文档吗?

时间:2018-02-06 09:18:33

标签: mongodb

我想构建一个查询,其中我在聚合的$project阶段根据之前的文档数据设置了truefalse的密钥。

这是我正在寻找的结构:

[
  {
    "_id": "5a79725a2ca81e5b7f84ef50",
    "name": "Lola",
    "hasDog": true,
    "neighbourWithDog": false,
    "address": "1st Street"
  },
  {
    "_id": "5a79725a5933283ab266e006",
    "name": "Nick",
    "hasDog": false,
    "neighbourWithDog": true,
    "address": "1st Street"
  }
]

字段neghbourWithDog取决于前一个文档中hasDog是设置为true还是false。

我可以在数据库响应之后轻松完成此操作,通过循环和if语句构建新响应,但是当数据开始堆积时,应用程序(Node JS)变得非常慢。

所以我想知道是否甚至可以执行这样的查询?我确实知道文档可以按任何顺序排列,所以我必须先对它们进行排序。

1 个答案:

答案 0 :(得分:0)

两种方式。首先是$project,第二个是$addFields。两者都使用$cond来检查"hasDog"true还是false

我的文件如下:

/* 1 */
{
    "_id" : ObjectId("5a7996911f496a82583c265a"),
    "name" : "Lola",
    "hasDog" : true,
    "address" : "1st Street"
}

/* 2 */
{
    "_id" : ObjectId("5a7996971f496a82583c266a"),
    "name" : "Nick",
    "hasDog" : false,
    "address" : "1st Street"
}

$project方式:

db.getCollection('foo').aggregate([
{ $project : 
  { _id : 0, 
    neighbourWithDog : 
     {  $cond: 
        { if: 
          { $eq : [ "$hasDog", true ] }, then: true, else: false } 
        }
     }
  }
])

输出:

/* 1 */
{
    "neighbourWithDog" : true
}

/* 2 */
{
    "neighbourWithDog" : false
}

$addFileds方式:

db.getCollection('foo').aggregate([
{ $addFields: 
   { neighbourWithDog : 
     {  $cond: 
        { if: { $eq : [ "$hasDog", true ] }, then: "true", else: "false" } 
        }
     }
   }
])

输出:

/* 1 */
{
    "_id" : ObjectId("5a7996911f496a82583c265a"),
    "name" : "Lola",
    "hasDog" : true,
    "address" : "1st Street",
    "neighbourWithDog" : "true"
}

/* 2 */
{
    "_id" : ObjectId("5a7996971f496a82583c266a"),
    "name" : "Nick",
    "hasDog" : false,
    "address" : "1st Street",
    "neighbourWithDog" : "false"
}

请注意,如果您不想要字符串"true""false",请删除" ",而您将拥有Boolean值,就像$projection示例

一样