簡體   English   中英

貓鼬查詢子文檔

[英]Mongoose Querying SubDocuments

您好,我試圖在MongoDB上查詢一些嵌套文檔。 我用貓鼬..我的文件就像

[
{
    "_id": "5a2ca2227c42ad67682731d4",
    "description": "some descrition",
    "photos": [
        {
            "_id": "5a2ca22b7c42ad67682731d5",  
            "approved": false,
            "text":"good"  
        },
        {
            "_id": "5a2ca72b0a1aa173aaae07da",
            "approved": true,
            "text":"bad"
        },
        {
            "_id": "5a2cabf85a41077a2f87d4e3",    
            "approved": false,
            "text":"bad"
        }
    ]
}
]

我想在文本屬性中僅找到具有“好”值的照片,這是我的查找代碼:

ObjectSchema.find({
        'photos': {
            $elemMatch : {
                'text' : 'good'
            }
        }
    },function(err,result){
       console.log(result);
    });

我只想返回帶有值與我的查詢相匹配的元素的objct,但是當此列表中的一個對象匹配時,整個照片列表都會附帶結果,而不僅僅是匹配文本的人。我如何查詢它,並只帶匹配的元素,在這種情況下,只帶文本中具有“ good”的元素。

即時通訊使用nodejs +貓鼬

謝謝!

您正在使用find只用條件,這將返回整個文檔。 您還可以指定帶有find的投影,以包含/排除文檔中的某些字段。 您可以按以下方式在投影中使用$ elemMatch:

ObjectSchema.find({
    'photos': {
        $elemMatch : {
            'text' : 'good'
        }
    }
}, {
    'photos': {
        $elemMatch : {
            'text' : 'good'
        }
    }
}, function(err,result){
   console.log(result);
});

但是要注意, 投影中的$ elemMatch只包含第一個匹配的array元素 根據示例文檔,這可能不是您想要的。 相反,您可以使用Aggregation Framework 您可以從以下內容開始(未經測試),然后根據需要調整輸出的形狀:

ObjectSchema.aggregate(
    {$unwind: "$photos"},
    {$match: {"photos.text": "good"}},
    function(err,result){
        console.log(result);
    }
)

$unwind為數組的每個元素制作一個單獨的文檔。

要按照注釋中的描述調整輸出,您需要使用$ group聚合 嘗試將類似於以下內容的$ group聚合添加到管道的末尾:

{$group: {_id: "$_id", photos: {$push: "$photos"}}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM