假设我的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
- 文档中第一个字段的所有文档?
我也会对一个解决方案感到满意,该解决方案只是告诉我shirt
中size
之前type
所在的哪些文档。
在MongoDB中查询嵌入式文档时,字段的顺序很重要。例如:
shirt
只会给我一件衣服,即使有两件衣服的尺码为db.outfits.find({ "shirt": { size: "M", type: "Long-sleeve" } })
Long-sleeve
的衬衫。
基本上我需要运行一个查询来标准化我的集合中的字段顺序,并且最好我想修复那些不正确顺序而不是重新插入所有内容的那些。
答案 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'
} })