返回mongodb中没有父对象的嵌套查询

时间:2015-09-23 18:17:13

标签: arrays mongodb nested

当我查询

db.Books.find({}, {_id: 0, "page.src": 1,"page.w": 1,"page.h": 1}).sort({"page.number": 1}).toArray()

它返回:

[
    {
        "page" : [
            {
                "src" : "http://xxx.xxx.xxx.png",
                "w" : 903,
                "h" : 1300
            },
            {
                "src" : "http://xxx.xxx.xxx2.png",
                "w" : 903,
                "h" : 1300
            }
        ]
    }
]

如何在没有父对象的情况下返回查询:

[
    {
        "src" : "http://xxx.xxx.xxx.png",
        "w" : 903,
        "h" : 1300
    },
    {
        "src" : "http://xxx.xxx.xxx2.png",
        "w" : 903,
        "h" : 1300
    }
]

此结果将是其他功能的输入

谢谢..

修改

在我的机器中,来自@chraidarn的代码返回如下:

[
    [
        {
            "src" : "http://xxx.xxx.xxx.png",
            "w" : 903,
            "h" : 1300
        },
        {
            "src" : "http://xxx.xxx.xxx2.png",
            "w" : 903,
            "h" : 1300
        }
    ]
] 

我的功能仍然无法正常运行。看起来非常接近。还有什么想让它完美运作吗?谢谢..,

编辑2

如果需要,这是相关的架构:

book: {
  type: String,
},
author: {
  type: String,
},
title: {
  type: String,
},
date: {
  type: Date,
},
page: {
  type: Array,
},
'page.$': {
  type: Object
},
'page.$.number': {
  type: Number
},
'page.$.src': {
  type: String
},
'page.$.w': {
  type: Number
},
'page.$.h': {
  type: Number
},
谢谢你,

4 个答案:

答案 0 :(得分:0)

map() 方法返回的光标使用 find() 方法返回没有父属性页的数组。要在mongo shell中演示这一点:

> var pages = db.Books.find({}, 
      {_id: 0, "page.src": 1,"page.w": 1,"page.h": 1})
  .sort({"page.number": 1})
  .map(function(doc){return doc.page});
> printjson(pages[0]); /* access the desired array result by index */
[
    {
        "src" : "http://xxx.xxx.xxx.png",
        "w" : 903,
        "h" : 1300
    },
    {
        "src" : "http://xxx.xxx.xxx2.png",
        "w" : 903,
        "h" : 1300
    }
]
>

答案 1 :(得分:0)

*One more option, you can use aggregation with map* 

> db.Books.aggregate([{$unwind:"$page"},{$project:{_id:0,"page":1}}]).map(function(doc){return doc.page}
)

**Result**

[
        {
                "src" : "http://xxx.xxx.xxx.png",
                "w" : 903,
                "h" : 1300
        },
        {
                "src" : "http://xxx.xxx.xxx2.png",
                "w" : 903,
                "h" : 1300
        }
]

答案 2 :(得分:0)

这可以使用像这样的聚合框架来完成

db.Books.aggregate( {$project: {"src" : "$page.src", "w": "$page.w", "h": "$page.h", _id: 0}} )

答案 3 :(得分:0)

无过滤器

db.Books.distinct("page")

过滤

db.Books.distinct("page", { "page": 1 })