【问题标题】:How to get mongodb deeply embeded document id如何获取 mongodb 深度嵌入的文档 id
【发布时间】:2014-10-06 10:12:42
【问题描述】:

我有以下 mongo 文档,它是一个更大的文档的一部分,称为属性,它也有颜色和大小

> db.attributes.find({'name': {'en-UK': 'Fabric'}}).pretty()
{
    "_id" : ObjectId("543261cda14c971132fa2b91"),
    "values" : [
        {
            "source" : [
                {
                     "_id" : ObjectId("543261cda14c971132fa2b79"),
                     "name" : {
                         "en-UK" : "Combed Cotton"
                     }
                },
            ],
            "name" : [
                {
                    "_id" : ObjectId("543261cda14c971132fa2b85"),
                    "name" : {
                        "en-UK" : "Brushed 3-ply"
                    }
               },
               {
                   "_id" : ObjectId("543261cda14c971132fa2b8f"),
                   "name" : {
                       "en-UK" : "Plain Weave"
                   }
               }, 
               {
                   "_id" : ObjectId("543261cda14c971132fa2b90"),
                   "name" : {
                        "en-UK" : "1x1 Rib"
                    }
               }
           ] 
       }
   ],
   "name" : { 
       "en-UK" : "Fabric"
   }

}

我正在尝试返回子文档的 _id 并具有以下内容:

db.attributes.aggregate([
   { '$match': {'name.en-UK': 'Fabric'} },
   { '$unwind' : '$values' },
   { '$project': { 'name' : '$values.name'} }, 
   { '$match': { '$and': [{"name.name.en-UK" : "1x1 Rib"} ] }}
])

这样做的正确方法是什么?

另外,Fabric 的值是一个包含两个项目的数组,sourcename,但如果我像这样填充它:

> db.attributes.find({'name': {'en-UK': 'Fabric'}}).pretty()
{
    "_id" : ObjectId("543261cda14c971132fa2b91"),
    "values" : {
            "source" : [{ ... }]
            "name": [{ ... }]
    }
}

我收到以下错误

"errmsg" : "异常:$unwind: 字段路径末尾的值必须是数组"

但是如果我把它放在方括号中,那么它就可以了,所以

> db.attributes.find({'name': {'en-UK': 'Fabric'}}).pretty()
{
    "_id" : ObjectId("543261cda14c971132fa2b91"),
    "values" : [{
            "source" : [{ ... }],
            "name": [{ ... }]
    }]
}

values 我缺少的是一个由两个对象组成的数组,sourcename 每个都包含一个数组列表

非常感谢任何建议

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您在这里似乎“遗漏”的是“某些”文档根本不包含“值”属性,或者至少它“不是数组”。这是您遇到的错误的基本背景。

    幸运的是,有几种方法可以解决这个问题。即,在提交原始查询时“测试”是否存在数组。或者在处理管道时实际上将缺失的元素“替换”为某种数组。

    这里是 两种 方法,实际上是一种冗余形式,因为第一个 $match 条件确实解决了这个问题:

    db.attributes.aggregate([
       { "$match": { 
           "name.en-UK": "Fabric",
           "values.0": { "$exists": true }
       }},
       { "$project": {
           "name": 1,
           "values": { "$ifNull": [ "$values", [] ] }
       }},
       { "$unwind": "$values" },
       { "$unwind": "$values.name" },
       { "$match": { "values.name.name.en-UK" : "1x1 Rib" }}
    ])
    

    正如我所说。真的多余,因为最初的 $match 实际上询问“初始数组元素”是否真的存在。哪种表示那里有一个数组。

    第二个$project 阶段实际上使用$ifNull 运算符“填充”一个值(或基本上是一个空数组),其中测试元素不存在。无论如何,我们之前都对此进行了测试,但这展示了不同的方法。

    但基本想法 id 要么是“避免”,要么是“填写”,您的文档没有您想要处理的预期数据。这是你的错误的原因。

    【讨论】:

    • 对不起,我得到一个空结果,{ "result" : [ ], "ok" : 1 }
    • @khinester 你并没有完全做到这一点。下次提交时从您的帖子中删除“标签”字符。编辑了重要的行。
    猜你喜欢
    • 1970-01-01
    • 2020-12-27
    • 2020-04-21
    • 1970-01-01
    • 2013-08-12
    • 2023-03-28
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    相关资源
    最近更新 更多