如何按MongoDB中的字段顺序查询?

时间:2018-02-20 12:08:29

标签: mongodb

假设我的MongoDB集合VIRTUAL-RUNTIME_syslog = "" 中有以下文档:

outfits

如何获取{ _id: ..., shirt: { type: "T-shirt", size: "M" } } { _id: ..., shirt: { type: "Long-sleeve", size: "M" } } { _id: ..., shirt: { type: "T-shirt", size: "S" } } { _id: ..., shirt: { size: "M", type: "Long-sleeve" } } { _id: ..., shirt: { type: "T-shirt", size: "L" } } 字段是嵌入式size - 文档中第一个字段的所有文档?

我也会对一个解决方案感到满意,该解决方案只是告诉我shirtsize之前type所在的哪些文档。

为什么?

在MongoDB中查询嵌入式文档时,字段的顺序很重要。例如:

shirt

只会给我一件衣服,即使有两件衣服的尺码为db.outfits.find({ "shirt": { size: "M", type: "Long-sleeve" } }) Long-sleeve的衬衫。

基本上我需要运行一个查询来标准化我的集合中的字段顺序,并且最好我想修复那些不正确顺序而不是重新插入所有内容的那些。

参考:https://softwareengineering.stackexchange.com/questions/319468/why-does-mongodb-check-for-order-of-keys-when-matching-embedded-documents

2 个答案:

答案 0 :(得分:1)

对于MongoDB> 3.4.4你可以这样做:

db.outfits.aggregate({
    $project: {
        firstField: { // create a new field "firstField"
            $arrayElemAt: [{ // get the first element of...
                $objectToArray: "$shirt" // ... the "shirt" subdocument represented as an array
            }, 0]
        }
    }
}, {
    $match: {
        "firstField.k": "size" // just return the ones we are interested in
    }
})

另请注意,您可以像这样查询,这将消除订单的问题:

db.outfits.find({ "shirt.size": "M", "shirt.type": "Long-sleeve" })

答案 1 :(得分:0)

我最终使用了以下内容:

db.outfits.find({ $where: function() {
  return Object.keys(this.shirt)[0] === 'type'
} })

但我也发现了更古老的东西:

db.outfits.find({ $where: function() {
  return tojsononeline(this)[64] === 't'
} })