到目前为止,我实现的是我在对象中获得了数组,我想直接使用数组。
这是我的目标:
{
"_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}")
它给了我相同的结果。
答案 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;})