2016-03-06 72 views
0

我的目标:猫鼬找到并只返回文档的一部分

[ 
    { 
     "_id": "568ad3db59b494d4284ac191", 
     "name": "Test", 
     "groups": [ 
     { 
      "number": "1", 
      "name": "GroupTest", 
      "_id": "568ad3db59b494d4284ac19b", 
      "orders": [ 
      { 
       "date": "2016-03-06T13:07:40.990Z", 
       "_id": "56dc2b9c1d47772806e4f0f4", 
       "readings": [ 
       { 
        "readingid": "568ad3db59b494d4284ac1a5", 
        "_id": "56dc2b9c1d47772806e4f0fc" 
       }, 
       { 
        "readingid": "568ad3db59b494d4284ac1a4", 
        "_id": "56dc2b9c1d47772806e4f0fb" 
       }, 
       { 
        "readingid": "568ad3db59b494d4284ac1a3", 
        "_id": "56dc2b9c1d47772806e4f0fa" 
       }, 
       { 
        "readingid": "568ad3db59b494d4284ac1a2", 
        "_id": "56dc2b9c1d47772806e4f0f9" 
       }, 
       { 
        "readingid": "56d48ae1a0f6e04413fc8b3e", 
        "_id": "56dc2b9c1d47772806e4f0f8" 
       }, 
       { 
        "readingid": "56d48ae1a0f6e04413fc8b3f", 
        "_id": "56dc2b9c1d47772806e4f0f7" 
       }, 
       { 
        "readingid": "568ad3db59b494d4284ac1a1", 
        "_id": "56dc2b9c1d47772806e4f0f6" 
       }, 
       { 
        "readingid": "568ad3db59b494d4284ac1a0", 
        "_id": "56dc2b9c1d47772806e4f0f5" 
       } 
       ] 
      }, 
      {....} 
      ] 
     }, 
     {....} 
     ] 
    }, 
    {.....} 
] 

我需要FINDE与_id顺序:“56dc2b9c1d47772806e4f0f4”组中与_id:“568ad3db59b494d4284ac19b”客户端对象中与_id:“568ad3db59b494d4284ac191”,我只想获得该订单子对象,而不是整个客户端对象。

我想是这样的:

Client.find(
{_id: "568ad3db59b494d4284ac191", groups._id: "568ad3db59b494d4284ac19b", groups.orders._id:"56dc2b9c1d47772806e4f0f4"}, 
{groups.orders:{$elemMatch:{_id: "56dc2b9c1d47772806e4f0f4"}}}) 

没有成功Antoher尝试:

Client.find(
{_id: req.company, groups:ObjectId(req.params.groupId)}, 
{"groups.orders":{$elemMatch:{_id: ObjectId(req.params.orderId)}}}, function(e,company){ 
    if(!e) { 
     console.log(company); 
    } 
}); 

回答

0

蒙戈是一个“面向文档的”数据库,因此,所有的正常操作和查询提供回报“的文件“而不是”文档的部分“,所以使用普通的查询方法是无法获得子对象的。

您可以使用两个$unwindhttps://docs.mongodb.org/manual/reference/operator/aggregation/unwind/来使用mongo汇总框架来实现您想要的(https://docs.mongodb.org/manual/reference/operator/aggregation/)。 这将为每个order生成一个文档,然后使用$match来筛选出您需要的文档。

但是,重新考虑你的数据模型可能会更好。如果您确实只需要查询和检索订单,而无需获取整个客户对象,则最好将订单存储在自己的集合中,并使用对组和客户的引用。