Database design 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

似乎几乎没有关于如何为MongoDB设计数据库的文档。所以我想我先把我的问题贴在这里

假设此集合(
水果库存
)为例:

{
    "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。