Mongodb:只获取此对象的帖子评论数组

时间:2017-12-08 06:50:26

标签: mongodb spring-boot mongodb-query

到目前为止,我实现的是我在对象中获得了数组,我想直接使用数组。

这是我的目标:

{
    "_id" : ObjectId("5a28e2a1bf22d2a9ddb8f5d5"),
    "description" : "My Post",
    "postLikes" : [ 
        {
            "likesCount" : 0,
            "likeByEmail" : "a@a.com",
            "createdOn" : NumberLong(1512631701702),
            "updatedOn" : NumberLong(0)
        }
    ],
    "postComments" : [ 
        {
            "comment" : "This is first comment",
            "likeByEmail" : "a@a.com",
            "createdOn" : NumberLong(1512643824764),
            "updatedOn" : NumberLong(1512643824764)
        }
    ],
    "createdOn" : NumberLong(0),
    "updatedOn" : NumberLong(0)
}

我的查询是:

db.user_posts.find({_id: ObjectId("5a28e2a1bf22d2a9ddb8f5d5")}, {postComments:1})

结果是:

{
    "_id" : ObjectId("5a28e2a1bf22d2a9ddb8f5d5"),
    "postComments" : [ 
        {
            "comment" : "This is first comment",
            "likeByEmail" : "a@a.com",
            "createdOn" : NumberLong(1512643824764),
            "updatedOn" : NumberLong(1512643824764)
        }
    ]
}

我想要的是:

 [ 
        {
            "_id" : null,
            "comment" : "This is first comment",
            "likeByEmail" : "a@a.com",
            "createdOn" : NumberLong(1512643824764),
            "updatedOn" : NumberLong(1512643824764)
        }
    ]

我也在Spring Boot中使用MongoRepository,查询有:

@Query(value = "{'_id' : ?0}, {'postComments':1}")

它给了我相同的结果。

3 个答案:

答案 0 :(得分:1)

您可以添加"_id":false

db.user_posts.find({
    _id: ObjectId("5a28e2a1bf22d2a9ddb8f5d5")
}, {
    postComments: 1,
    "_id": false
})

"_id":0

db.user_posts.find({
    _id: ObjectId("5a28e2a1bf22d2a9ddb8f5d5")
}, {
    postComments: 1,
    "_id": 0
})

如果您只想要部分文档,那么您必须使用聚合框架。幸运的是,有弹簧支持。

正如vaibhav已经提到find()返回的内容。

您可以通过以下方式解决您的问题:

db.user_posts.aggregate([
{ $match: {_id: ObjectId("5a28e2a1bf22d2a9ddb8f5d5")}},
{ $unwind: "$postComments"},
{ $project: {
    _id: 0,
    comment: "$postComments.comment",
    likeByEmail: "$postComments.likeByEmail",
    createdOn: "$postComments.createdOn",
    updatedOn: "$postComments.updatedOn"
  }
}
])  

正如@Veeram所提议的,您也可以这样做:

db.user_posts.aggregate([
{ $match: {_id: ObjectId("5a28e2a1bf22d2a9ddb8f5d5")}},
{ $unwind: "$postComments"},
{ $replaceRoot: {"newRoot":"$postComments"}}
])  

答案 1 :(得分:0)

使用find,您将永远无法获得数组,因为根据定义:

  

find()方法“返回文件”,实际上是方法   将光标返回到文档。

您可以对结果集应用投影,但实际上它总是会返回一个文档,遗憾的是它永远是一个json并将数组作为属性嵌入。

同样适用于insert函数,你不能自己插入一个数组,它必须是一个有效的JSON。

> db.arrCollection.insert(["name":"myName", "age": 100]);
2017-12-08T13:02:30.492+0530 E QUERY    SyntaxError: Unexpected token :

答案 2 :(得分:0)

你可以试试这个

  

db.user_posts.find({_ id:ObjectId(" 5a28e2a1bf22d2a9ddb8f5d5")},{postComments:1})。then(function(u){return u.postComments;})