【问题标题】:per row sorting of associative containers serialized to mongo arrays序列化为 mongo 数组的关联容器的每行排序
【发布时间】:2012-02-07 13:07:16
【问题描述】:

我有一个在 mongo db 数组中序列化的关联容器(具有 c++ 映射的语义)。在我的集合中,我检索包含我的密钥的数组。

db.qrs.find( { "u.i" : 111892 })

我想对我的“地图”的“价值”元素进行排序。如:

db.qrs.find( { "u.i" : 731612 }).sort( { "u.c" : -1} )

但是,这只是对文档中的数组进行排序,而不是对结果集中的每一行进行排序。排序行示例:

 { "_id" : ObjectId("4f2f9acea2b3adfce39ae395"), "i" : 11, "r" : 1, 
"s" : ")n(kQ!$A=@%RPv-SB0dQXh7ME*%lw=!$@(VshFU1H6#b7r*wb()t3Ps!^xQ1rNr7j", "u" : 
[   {   "c" : 7,    "i" : 29518,    "p" : 0 },  { "c" : 1,  "i" : 
924577,     "p" : 3 },  {   "c" : 1,    "i" : 731612,   "p" : 1 } ] }

我希望位置运算符可能会起作用,可惜它没有达到我的预期,我的查询被表述为:

db.qrs.find( { "u.i" : 111892 }).sort( { "u.$.c" : -1} )

那么,我想要的查询是什么样的?

我能否以某种方式转置结果集以提升与我的谓词匹配的键值对成为结果集顶级文档结构的一部分?

【问题讨论】:

    标签: mongodb data-structures database


    【解决方案1】:

    MongoDB 从不对数组本身进行排序。您会看到文档中存在的数组。

    MongoDB 目前不支持您的特定用例。您不能匹配查询中的特定元素,然后单独对该元素进行排序。

    您只能通过避免使用数组来解决此问题,例如使用“i”的值作为嵌入元素的键:

    { "_id" : ObjectId("4f2f9acea2b3adfce39ae395"), "i" : 11, "r" : 1, 
    "s" : ")n(kQ!$A=@%RPv-SB0dQXh7ME*%lw=!$@(VshFU1H6#b7r*wb()t3Ps!^xQ1rNr7j", "u" : 
    {29518:   {   "c" : 7, "p" : 0 },  924577: { "c" : 1,"p" : 3 },  731612: {   "c" : 1,   "p" : 1 } }}
    

    然后你就可以排序了

    db.qrs.find({"u.29518":{$exists:true}}).sort({"u.29518.c"-1})
    

    显然,您可能无法使用此解决方案,但我看不到任何其他不涉及将您的数组元素放入专用集合的路线(我认为这是更好的架构决策)。

    【讨论】:

    • 感谢您的回答。天哪,我什至没有考虑过这种方法。我不期待 2 天的处理时间:/。但是,有没有办法在子文档的“关键”部分指定索引?
    • 不,你总是索引值。因此,在这种情况下,您必须为每个唯一的“i”编制索引,这通常不是一个选项。如果您要求您唯一的选择是一个单独的集合,其中包含数组元素的顶级文档,并引用您当前的顶级文档。
    • 好吧,我想我得改变我的架构并重建:D 谢谢你的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    相关资源
    最近更新 更多