Database design MongoDB有多聪明?
似乎几乎没有关于如何为MongoDB设计数据库的文档。所以我想我先把我的问题贴在这里 假设此集合(Database design MongoDB有多聪明?,database-design,mongodb,Database Design,Mongodb,似乎几乎没有关于如何为MongoDB设计数据库的文档。所以我想我先把我的问题贴在这里 假设此集合(水果库存)为例: { "name" : "Orange", "type" : "citric", "available" : 3 } { "name" : "Apple", "type" : "pome", "available" : 0 "note" : "Not shipping this
水果库存
)为例:
{
"name" : "Orange",
"type" : "citric",
"available" : 3
}
{
"name" : "Apple",
"type" : "pome",
"available" : 0
"note" : "Not shipping this month"
}
{
"name" : "Pear",
"type" : "pome",
"available" : 2
}
(未设置索引)
1) 字段选择
db.fruits\u inventory.findOne({name:“Orange”},{“note”:1})代码>
此查询是否会查找仅包含值为橙色的字段名称,并在第一次点击时返回的文档,即使该文档未设置注释字段?或者它会继续搜索包含注释
字段的文档吗
2) 具有唯一索引
如果我在名称
上设置了唯一索引,上一个问题的答案会改变吗
现在只有这两个问题。如有答复,将不胜感激
我写了以下脚本:
// sofruit.js
db = db.getSiblingDB('test');
db.fruits_inventory.drop();
db.fruits_inventory.save({
"name" : "Orange",
"type" : "citric",
"available" : 3
});
db.fruits_inventory.save({
"name" : "Apple",
"type" : "pome",
"available" : 0,
"note" : "Not shipping this month"
});
db.fruits_inventory.save({
"name" : "Pear",
"type" : "pome",
"available" : 2
});
var a1 = db.fruits_inventory.findOne({name:"Orange"},{"note":1});
db.fruits_inventory.ensureIndex({name:1}, {unique:true});
var a2 = db.fruits_inventory.findOne({name:"Orange"},{"note":1});
然后我从mongo shell运行它,得到:
> load('../mongojs/sofruit.js');
> a1
{ "_id" : ObjectId("4e7d119e9b3e59bf2e0c5199") }
> a2
{ "_id" : ObjectId("4e7d119e9b3e59bf2e0c5199") }
>
因此,答案是“是”,它将返回第一次命中,即使它没有“note”字段集。添加索引不会改变这一点。您可以直接连接到mongodb并检查它:
MongoDB shell version: 2.0.0
connecting to: test
> use test
switched to db test
> db.fruits_inventory.save({
... "name" : "Orange",
... "type" : "citric",
... "available" : 3
... });
> db.fruits_inventory.save({
... "name" : "Pear",
... "type" : "pome",
... "available" : 2
... })
> db.fruits_inventory.save({
... "name" : "Apple",
... "type" : "pome",
... "available" : 0,
... "note" : "Not shipping this month"
... })
> db.fruits_inventory.find()
{ "_id" : ObjectId("4e7d0fa5626e0ab7b5074bb0"), "name" : "Orange", "type" : "citric", "available" : 3 }
{ "_id" : ObjectId("4e7d101b626e0ab7b5074bb1"), "name" : "Pear", "type" : "pome", "available" : 2 }
{ "_id" : ObjectId("4e7d1059626e0ab7b5074bb2"), "name" : "Apple", "type" : "pome", "available" : 0, "note" : "Not shipping this month" }
> db.fruits_inventory.find({name: "Orange"},{"note":1})
{ "_id" : ObjectId("4e7d0fa5626e0ab7b5074bb0") }
> db.fruits_inventory.ensureIndex({name:1}, {unique:true})
> db.fruits_inventory.find({name: "Orange"},{"note":1})
{ "_id" : ObjectId("4e7d0fa5626e0ab7b5074bb0") }
因此,在回答您的问题时,当您查询note字段时,它只会返回id,并且具有唯一索引没有任何区别。当您尝试它时会发生什么?我真的不能,因为在任何情况下,查询都会返回NULL。我还能如何测试它呢?没有关于如何设计的文档:不正确。但在这里也很不相关。你需要关于查询的文档,这是有很好的文档记录的。顺便说一句。。这些查询没有结果。。这告诉你了吗?你还可以测试什么?>我真的不能,因为查询在任何情况下都会返回NULL-你真的应该试试…@Berniehakett:当然我试过了,我使用了PHP驱动程序,我一直得到NULL,这很有意义,因为我请求的字段在任何情况下都找不到。不确定你的意思是什么“它将只返回索引”--也许“它将使用索引[为查询提供服务]”?谢谢=)来自PHP API(这就是我使用的),我只是不断得到NULL。