提问人:Edmondo 提问时间:4/15/2013 最后编辑:MachavityEdmondo 更新时间:3/3/2023 访问量:285653
如何查询嵌套对象?
How to query nested objects?
问:
使用嵌套对象表示法查询mongoDB时遇到问题:
db.messages.find( { headers : { From: "[email protected]" } } ).count()
0
db.messages.find( { 'headers.From': "[email protected]" } ).count()
5
我看不出我做错了什么。我希望嵌套对象表示法返回与点表示法查询相同的结果。我哪里错了?
答:
db.messages.find( { headers : { From: "[email protected]" } } )
这查询了等于 的文档,即不包含其他字段。headers
{ From: ... }
db.messages.find( { 'headers.From': "[email protected]" } )
这仅查看字段,不受 中包含的其他字段或缺少的其他字段的影响。headers.From
headers
评论
conditions['some.path'] = 'value'
find(conditions, fields, callback);
domains.domain.com
这两种查询机制以不同的方式工作,如子文档部分的文档中所建议的那样:
当字段包含嵌入文档(即子文档)时,您可以将整个子文档指定为字段的值,或者使用点表示法“进入”子文档,以指定子文档中各个字段的值:
如果子文档与指定的子文档(包括字段顺序)完全匹配,则在子文档中选择文档中的相等匹配。
在以下示例中,查询匹配字段生产者值为子文档的所有文档,该子文档仅包含具有值的字段和具有值的字段,按确切顺序排列:company
'ABC123'
address
'123 Street'
db.inventory.find( {
producer: {
company: 'ABC123',
address: '123 Street'
}
});
评论
由于对 MongoDB 集合与子文档的查询存在很多混淆,我认为有必要用示例来解释上述答案:
首先,我只在集合中插入了两个对象,即:message
> db.messages.find().pretty()
{
"_id" : ObjectId("5cce8e417d2e7b3fe9c93c32"),
"headers" : {
"From" : "[email protected]"
}
}
{
"_id" : ObjectId("5cce8eb97d2e7b3fe9c93c33"),
"headers" : {
"From" : "[email protected]",
"To" : "[email protected]"
}
}
>
那么查询的结果是什么:
db.messages.find({headers: {From: "[email protected]"} }).count()
它应该是一个,因为这些对文档的查询等于对象,仅包含其他字段,或者我们应该将整个子文档指定为字段的值。headers
{From: "[email protected]"}
所以根据 @Edmondo1984 的回答
子文档中的相等匹配 如果子文档与指定的子文档(包括字段顺序)完全匹配,则选择文档。
从上面的语句来看,下面的查询结果应该是什么?
> db.messages.find({headers: {To: "kprasad.ii[email protected]", From: "[email protected]"} }).count()
0
如果我们要更改第二个文档的子文档的顺序,即与子文档相同怎么办?From
To
> db.messages.find({headers: {From: "reservat[email protected]", To: "[email protected]"} }).count()
1
因此,它与指定的子文档(包括字段顺序)完全匹配。
对于使用点运算符,我认为每个人都非常清楚。让我们看看以下查询的结果:
> db.messages.find( { 'headers.From': "[email protected]" } ).count()
2
我希望上述示例的这些解释将使某人更清楚地了解使用子文档查找查询。
评论
//Simple and best solution complete code with example
const mongoose = require("mongoose");
mongoose
.connect("mongodb://127.0.0.1:27017/test")
.then(() => console.log("Connected!"));
const blogSchema = new mongoose.Schema({
title: String,
author: String,
body: String,
date: { type: Date, default: Date.now },
hidden: Boolean,
meta: {
votes: Number,
favs: Number,
},
});
const Bloging = mongoose.model("Blog", blogSchema);
const createDocument = async () => {
const doc = new Bloging({
title: "node js",
author: "adil",
body: "Monngose Traning",
hidden: true,
meta: {
votes: 1000,
favs: 30,
},
});
const doc2 = new Bloging({
title: "vue js",
author: "adil",
body: "Monngose Traning",
hidden: true,
meta: {
votes: 20,
favs: 80,
},
});
const doc3 = new Bloging({
title: "React js",
author: "adil",
body: "Monngose Traning",
hidden: true,
meta: {
votes: 30,
favs: 60,
},
});
await Bloging.insertMany([doc, doc2, doc3]); // Throws "document must have an _id before saving"
};
const getDocument = async () => {
const result = await Bloging.find({ "meta.favs": { $gt: 60 } });
console.log(result);
};
createDocument();
getDocument();
enter code here
**strong text**
上一个:嵌套的 ifelse 语句
评论